ทำไมไม่ส่งคืนวันที่เป็นสตริงจากฐานข้อมูล


41

ในเว็บแอปพลิเคชันทั่วไปวันที่จะถูกดึงจากเลเยอร์ฐานข้อมูลที่พิมพ์อย่างรุนแรง (เช่นใน c # เป็น System.DateTime ซึ่งตรงกันข้ามกับ System.String)

เมื่อวันที่จะต้องแสดงเป็นสตริง (เช่นแสดงบนหน้า) การแปลงจาก DateTime เป็นสตริงจะทำในชั้นนำเสนอ

ทำไมนี้ ทำไมการแปลง DateTime ให้เป็นสตริงในระดับฐานข้อมูลจึงเป็นเรื่องที่ไม่ดี

ดูการอภิปรายที่ร้อนแรงในการแชทและคำถามเดิมที่เริ่มต้นสิ่งเหล่านี้ทั้งหมด


73
ขอผมถามคุณ: คุณจะแปลงทุกประเภทเป็นสตริงไหม? อะไรที่ทำให้เดทแตกต่างกัน?
Gardenhead

7
คำถามที่ดี! โปรดดูการอภิปรายอุ่นในความคืบหน้าได้ที่นี่
John Wu

8
ดูเหมือนว่าจะเห็นได้ชัดว่าคนอื่นนั้นผิดและทุกคนก็พูดถูก ไม่ใช่คำถามจริงๆที่นี่
Gardenhead

7
บางครั้งคุณต้องทำคณิตศาสตร์วันที่นอกฐานข้อมูล ยากกว่านี้มากถ้าคุณมีสาย
Eric King

14
ปัญหาอื่น - คุณต้องการสตริงประเภทใด มีหลายวิธีในการแสดงวันที่และเวลาเป็นสตริง จะเกิดอะไรขึ้นถ้าฉันมีฐานข้อมูลที่คืนค่าเวลาปัจจุบันซึ่งแสดงเป็น # ของวินาทีนับตั้งแต่ยุคเป็นสตริง (ตัวอย่างเช่นเวลาปัจจุบันคือ "1474496980") มันจะมีประโยชน์หรือไม่ คุณต้องการใช้ฐานข้อมูลแบบนั้นหรือไม่?
riwalk

คำตอบ:


168

วัน DateTimes และจริงๆวัตถุพิมพ์อื่น ๆ ทั่วไปควรทิ้งให้อยู่ในรูปแบบที่พิมพ์ถูกต้องของพวกเขาจนกว่าช่วงเวลาที่คุณต้องการให้พวกเขาจะทำในประเภทอื่น ๆ บาง - โดยเฉพาะอย่างยิ่งเมื่อชนิดที่เป็นรูปแบบการอ่านของมนุษย์และโดยเฉพาะอย่างยิ่งเมื่อมันสูญเสีย / การ การเรียงลำดับการแปลงทางเดียว

ทำไม? เนื่องจากมีการสันนิษฐานว่าประเภทนั้นมีฟังก์ชันการทำงานที่มีประโยชน์มากมายเช่นการทดสอบความเท่าเทียมกันที่เหมาะสมการบวกและการลบการเปรียบเทียบ (มากกว่า, น้อยกว่า), เขตเวลาและฟังก์ชันตำแหน่งที่ตั้ง (โดยเฉพาะสิ่งที่เกี่ยวข้องกับเวลา) เป็นต้นหากคุณต้องการสนับสนุนชาวอเมริกันและรูปแบบ "วันเดือน [ปี] ปี" รวมถึงรูปแบบอังกฤษทั่วไปของ "วันเดือนปี" หรือมาตรฐาน ISO ของ "ปีวันเดือน"? คุณจะทำอย่างไรถ้ามันเป็นสตริงและคุณจำเป็นต้องทำการเปลี่ยนแปลงนั้นแยกมันกลับเป็นวันที่? ฮึไม่ต้องขอบคุณ - มีความชั่วร้ายมากมายและโรคจิตที่ขี้ขลาดตาขาวอย่างนั้นซึ่งหลีกเลี่ยงได้ทั้งหมด

โดยเฉพาะอย่างยิ่งคุณกล่าวถึงสถาปัตยกรรมที่ทำเป็นชั้นซึ่งมีเลเยอร์การนำเสนอแยกต่างหากจากข้อมูลในภายหลัง นี่คือเหตุผลใหญ่อื่น ๆ ในการส่ง Date เป็น Date ไม่ใช่สตริง - เพราะประเภทการจัดรูปแบบสตริงควรใส่วันที่ไว้ในประเภทใด ภาษาอังกฤษ, ภาษาจีน, มีหรือไม่มีวินาที / มิลลิวินาที, ชื่อเต็มเดือนหรือตัวเลข, คุณต้องการเรียงลำดับในฟิลด์วันที่ในภายหลัง (การเรียงลำดับบนสตริงต้องการรูปแบบสตริงที่แน่นอนหรือไม่ถ้าคุณต้องการใช้งาน) นี่คือคำถามทั้งหมดของการนำเสนอ - วิธีที่ผู้ใช้ควรดูข้อมูล - และวางตรรกะนั้นทุกที่อื่นจะ จำกัด ข้อได้เปรียบของการมีสถาปัตยกรรมแบบลำดับชั้นในสถานที่แรก ฐานข้อมูลไม่จำเป็นต้องรู้หรือสนใจว่าคุณต้องการดูวันที่ในอนาคตอย่างไร

ในที่สุดแอพพลิเคชั่นที่ซับซ้อนเกือบทั้งหมด (ซึ่งเป็นสถาปัตยกรรมแบบฉัตรสำหรับ) ที่ใส่ใจเกี่ยวกับเวลาจะใช้เวลา / วันที่อย่างหลีกเลี่ยงไม่ได้ในหลาย ๆ วิธีที่แตกต่างกันและมักจะอยู่ในระดับต่าง ๆ ของสถาปัตยกรรม วัตถุที่พิมพ์ที่เกี่ยวข้องกับเวลาและวันที่มีอยู่ด้วยเหตุผลที่ดีจริงๆ: เวลาเองและโดยเฉพาะอย่างยิ่งระบบปฏิทินของมนุษย์นั้นแปลกและยาก ท้ายที่สุดเวลาและวันที่ไม่ใช่สตริงด้วยเหตุผลเดียวกับที่จำนวนเต็มและคะแนนลอยไม่ใช่สตริงและมันจะทำให้ชีวิตของคุณยากขึ้นหากคุณพยายามแกล้งพวกเขาเป็นเพียงแค่อาร์เรย์ของตัวละครเพราะพวกเขาไม่ได้


26
+1 เพียงแค่ใช้คำที่ขี้ขลาดตาขาว ฉันเห็นด้วยกับข้อโต้แย้งที่น่าสนใจของคุณและคำอธิบายที่ครอบคลุม แต่นั่นเป็นสาเหตุที่ฉันต้องเข้าสู่ระบบและลงคะแนนให้คุณ
Adrian Larson

1
การแสดงวันที่และเวลาเป็นวินาทีตั้งแต่เวลาที่กำหนดในอดีตยังมีความแข็งแกร่งในปฏิทินที่แตกต่างกัน เช่นปฏิทินอิสลามและจีนไม่ได้ใช้ Greogrian เดือนหมายเลขปี ฯลฯ ฉันจะพิจารณาจัดการในระดับฐานข้อมูลว่าเป็นการปฏิบัติที่ไม่ดี
rexkogitans

วันที่มักถูกนำเสนอเป็น "X วันที่แล้ว" ขอให้โชคดีในการแยกวิเคราะห์ว่ากลับไปเป็นค่าดั้งเดิม
Agent_L

5
อย่าลืมปัญหาการเปลี่ยนแปลงเวลา (และอื่น ๆ ที่คล้ายกัน) ด้วย จะ"6 พฤศจิกายน 2016 01:30:26"เป็นครั้งแรกหรือครั้งที่สองว่าวันนี้และเวลาที่จะเกิดขึ้น? UTC DateTime นั้นมีความเป็นเอกลักษณ์อย่างน้อยที่สุดและคุณสามารถแปลเป็นตัวแทนท้องถิ่นในเวลานั้นได้ - ไม่สามารถย้อนกลับไปทางอื่นได้เสมอ
เจ ...

3
Why? Because it is assumed that the type provides you with lots of handy built in functionalityในความคิดของฉันนี้เป็นเพียงรอง เหตุผลที่แท้จริงคือคนประเภทที่จะบอกคุณว่ามีอะไรบางอย่าง วันที่ไม่ใช่สตริงมันเกิดขึ้นกับการแปลเป็นสตริงที่มนุษย์อ่านได้ง่าย
Doval

53

เขาบอกว่าจะใช้เว็บเซิร์ฟเวอร์เพื่อแปลงเวลาข้อมูลเป็นสตริง ฉันกำลังบอกว่าทำบนเซิร์ฟเวอร์ฐานข้อมูลไม่ใช่เว็บเซิร์ฟเวอร์ ทำไมคุณคิดว่าดีกว่า - หัวหน้า MT

ฉันต้องการทราบประเภท

ฉันไม่สนใจหรอกว่าฐานข้อมูลของคุณเก็บข้อมูลไว้ในสตริง ints หรือ bytes บางอันเพราะในท้ายที่สุดแล้วมันจะเป็นจำนวนไบต์เสมอ สายนั้นใช้พื้นที่มากเกินความต้องการในฐานข้อมูลของคุณไม่รบกวนฉัน สิ่งที่ทำให้ฉันรำคาญใจในวันที่เช่นนี้:

2016/11/10

และไม่รู้ว่านั่นคือเดือนที่สิบเอ็ดหรือสิบเดือน

แต่มันผ่านการตรวจสอบคุณพูด แน่ใจว่าคุณใส่มันผ่านกระบวนการตรวจสอบ วันที่ถูกต้องสมบูรณ์ แต่ที่นี่ฉันกำลังรักษาสิ่งนี้และสิ่งที่ฉันรู้ก็คือวันที่เป็นสตริง ฉันไม่สามารถบอกคุณได้ว่าวันนี้เป็นวันอะไร

"วันที่สิบของเดือนพฤศจิกายนในปีที่สองพันและสิบหกของเจ้าของเรา"

นั่นคือสตริง หนึ่งในงานนำเสนอของเราต้องการในรูปแบบนั้น คุณบอกว่าฐานข้อมูลแปลงวันที่ทั้งหมดเป็นสตริงใช่ไหม? ขอให้สนุกกับสิ่งนั้น

หน้าที่ของฐานข้อมูลคือการจัดเก็บข้อมูลที่ไม่แสดงข้อมูล แน่นอนว่าคุณสามารถทำสิ่งนั้นได้ในสตริง แต่คุณต้องแยกมันออกเพื่อให้มีประโยชน์สำหรับการนำเสนอในรูปแบบอื่น การจัดเก็บในรูปแบบแยกวิเคราะห์มาตรฐานสำหรับประเภทใดก็ตามที่ข้อเสนอ DB ทำให้เราใกล้เคียงกับการนำเสนออย่างที่เราสามารถทำได้โดยไม่ต้องทำการตัดสินใจนำเสนอ มันไม่สำคัญสำหรับฉันถ้า DB สำรองประเภทนั้นด้วยสตริงหรือ ints หรือไบต์ ตราบใดที่มันรู้ว่ากำลังทำอะไรอยู่

แต่เมื่อคุณไม่ปล่อยให้ DB รู้ว่าเรากำลังจัดการกับวันที่และเก็บวันที่เป็นสตริงคุณจะนำเสนอและโปรดปรานการนำเสนอหนึ่งรายการก่อนเวลาอื่น ๆ ทั้งหมด สิ่งนี้จะบังคับให้ผู้นำเสนออื่น ๆ แยกวิเคราะห์ก่อนที่จะแปลง ไม่ฐานข้อมูลไม่ได้เป็นส่วนหนึ่งของเลเยอร์การนำเสนอ อย่าขอให้เป็น

เลเยอร์การนำเสนอนั้นไม่ได้เป็นส่วนหนึ่งของฐานข้อมูลดังนั้นจึงไม่ควรรายงานคู่กับรายละเอียดฐานข้อมูล มันมีประสิทธิภาพมากกว่าในการใช้กับประเภท


คำตอบนี้เน้นที่เก็บข้อมูลเป็นสตริง อย่างไรก็ตามมันไม่ได้ระบุรูปแบบทั่วไปของการจัดเก็บวันที่ในประเภทวันที่เนทิฟ แต่จากนั้นการจัดรูปแบบนั้นไปยังสตริงในแบบสอบถาม SQLโดยใช้ฟังก์ชันเช่น CONVERT (T-SQL) หรือโดยทั่วไปแล้ว DBMS จะทำให้วันที่เป็นอนุกรม เป็นสตริงในรูปแบบที่สามารถกำหนดค่าได้ไม่ว่าจะใช้แบบสอบถามใด ตัวอย่างเช่น: postgresql.org/docs/9.5/static/…
dcorking

นั่นเป็นรายงาน มันเกิดขึ้นหลังจากการจัดเก็บ ชอบแปลงวันเกิดของฉันให้เป็นอายุ
candied_orange

2
ฉันแค่อยากจะแนะนำให้คุณขยายคำตอบของคุณเนื่องจากหัวข้อของ OP คือ " ดึงข้อมูลวันที่จากเลเยอร์ฐานข้อมูล" มีรูปแบบที่ดีขึ้นแม้ว่าจะคัดค้านรูปแบบที่รายงานรายงานแบบสอบถามฐานข้อมูลสำหรับสตริงวันที่จัดรูปแบบและแปล ฉันคิดว่า OP ต้องการได้ยินการโต้แย้งแย้ง ฉันรู้ว่าฉันจะ
dcorking

@dcorking บันทึกการปรับปรุง
candied_orange

+1 เติมน้ำให้กับโรงสีมากขึ้น: เพียงแค่สร้างระบบบนฐานที่ติดตั้งซึ่งครอบคลุมหลายเขตเวลาโดยที่การโต้ตอบแบบทันทีที่สำคัญยิ่งและดูว่าคุณทำได้ดีกับสตริง <-> การแปลงเวลาประทับทุกที่ ที่แย่ที่สุดทำจุดขยายสำหรับผู้คนในการสร้างปลั๊กอินของตัวเองและให้พวกเขาประทับเวลาเป็นสตริงดูว่าการประทับเวลาเหล่านี้จะสอดคล้องกัน!
Newtopian

19

สถานที่เกิดเหตุ

การแปลงวันที่เป็นสตริงเพื่อวัตถุประสงค์ในการนำเสนอนั้นจำเป็นต้องทราบการตั้งค่าของผู้ใช้เนื่องจากวันที่แน่นอนเดียวกันโดยทั่วไปควรจะแสดงแตกต่างกันสำหรับผู้ใช้ในสถานที่ที่แตกต่างกัน แม้ว่าคุณจะใช้โลแคลเดียวในแอปพลิเคชันของคุณ แต่พฤติกรรมที่เหมาะสมควรใช้โลแคลของแอปพลิเคชันแทนเซิร์ฟเวอร์ฐานข้อมูล และไม่รับประกันว่าจะเหมือนกันแม้ว่าในขณะนี้พวกเขาจะจับคู่กันโดยบังเอิญ

การแปลงจากประเภทข้อมูลวันที่สากลเป็นสตริงเฉพาะสถานที่ควรเกิดขึ้นในเลเยอร์การนำเสนอเพราะเป็นเลเยอร์ที่รู้วิธีการแปลงที่ควรดำเนินการ


3
สำหรับตัวอย่างชีวิตจริงของสถานที่เกิดเหตุไม่ตรงกันลองนึกภาพการเขียนแอพสำหรับเมนผู้ใช้สหรัฐฯจากนั้นโฮสต์ในเซิร์ฟเวอร์ฟาร์มชายฝั่งตะวันตกของอเมซอน ;) นี่ไม่ใช่สถานการณ์ที่ไม่น่าเป็นจริง
jpmc26

@ jpmc26 ฉันไม่เข้าใจความแตกต่าง - เมนใช้รูปแบบวันที่ที่แตกต่างกับส่วนที่เหลือของสหรัฐอเมริกาหรือไม่
Pete Kirkham

2
@PeteKirkham Maine และชายฝั่งตะวันตกของสหรัฐอเมริกาใช้เขตเวลาที่ห่างกัน 3 ชั่วโมง
jpmc26

1
หรืออีกสถานการณ์หนึ่งในชีวิตจริง: ลองนึกภาพการใช้เซิร์ฟเวอร์ในสวิตเซอร์แลนด์ที่ต้องให้บริการลูกค้าในภาษาต่าง ๆสี่ภาษา (เยอรมัน, ฝรั่งเศส, อิตาลี, อังกฤษ) ที่มีตำแหน่งที่ตั้งต่างกัน (และกฎการจัดรูปแบบที่แตกต่างกันเล็กน้อย) โชคดีที่เลือกสถานที่ที่เหมาะสมสำหรับเซิร์ฟเวอร์ของคุณในสถานการณ์เช่นนี้
Voo

1
@ jpmc26 เขตเวลาและที่ตั้งไม่ใช่สิ่งเดียวกัน ตัวอย่างเช่นเรามีสำนักงานในกลาสโกว์สกอตแลนด์, แอตแลนตาสหรัฐอเมริกาและปูนอินเดีย ผู้ให้คำปรึกษาในสำนักงานเหล่านี้จะเปิดไซต์ติดตาม (มหาวิทยาลัยโรงพยาบาลโรงแรม ฯลฯ ) ทั่วโลกตลอดเวลา ฐานข้อมูลแอปพลิเคชันทำงานใน UTC แต่แสดงเวลาตามเวลาท้องถิ่นของไซต์ที่กำลังตรวจสอบ ที่ปรึกษาของสหรัฐอเมริกาได้กำหนดวันที่เป็น MM / DD / YYYY แต่ที่ตั้งของสหราชอาณาจักรและอินเดียนั้นเป็น DD / MM / YYYY ซึ่งขึ้นอยู่กับสถานที่ไม่ใช่เขตเวลาของไซต์หรือผู้ใช้
Pete Kirkham

9

สิ่งนี้ไม่เป็นที่ต้องการด้วยเหตุผลเดียวกับที่คุณไม่ต้องการเพียงแค่แปลงชนิดใด ๆเป็นสตริงในทันทีที่มันกระทบกับระดับแอพพลิเคชัน มีความเป็นไปได้สูงมากที่คุณจะต้องการใช้วัตถุนั้นในลักษณะใด ๆ ก่อนที่จะนำเสนอให้กับผู้ใช้ สำหรับตัวอย่างที่เฉพาะเจาะจงนี้ลองจินตนาการว่าคุณจำเป็นต้องทำคณิตศาสตร์วันที่บนวัตถุ ไม่มีข้อเสียเพียงแปลงวัตถุเป็นสตริงได้อย่างแม่นยำก่อนที่จะแสดง


4

ประเภทมีอยู่ด้วยเหตุผลถ้าพวกเขาไม่เพิ่มประโยชน์เราก็จะไม่มีพวกมันและจะไม่ใช้มันและเราก็จะมี "ประเภท" และทุกอย่างก็จะเป็นเช่นนั้น ไม่เพียง แต่สะดวกเท่านั้น แต่ยังเพิ่มความปลอดภัยและประสิทธิภาพ ต่อไปนี้เป็นรายชื่อของเหตุผลที่คุณควรจะยังคงมีอยู่ประเภทในรูปแบบพื้นเมืองของพวกเขาและไม่เป็นสตริง ฉันใช้DateTimeเป็นตัวอย่างส่วนใหญ่ แต่ใช้หลักการเดียวกันกับประเภทดั้งเดิมเช่นจำนวนเต็มทศนิยมทศนิยมไบนารีเป็นต้น


ที่เก็บข้อมูล

ข้อ จำกัด

พิมพ์ข้อ จำกัด

ที่เก็บข้อมูลเกือบทั้งหมดอนุญาตให้ระบุข้อ จำกัด ของข้อมูลซึ่งรวมถึงข้อ จำกัด ประเภท หนึ่งในประโยชน์หลักของการระบุDateTimeอินสแตนซ์คือข้อมูลที่เก็บไว้จะถูก จำกัด ประเภท จะไม่มีทางเป็นไปได้ที่จะป้อนสิ่งอื่นนอกเหนือจากวันที่โดยไม่คำนึงถึงวิธีการแทรกข้อมูลลงในร้านค้า ระบบหลังมีความสำคัญสำหรับระบบที่มีขนาดใหญ่กว่าซึ่งมีหลายกระบวนการที่ทำงานโดยตรงกับที่จัดเก็บ ซึ่งรวมถึงการพยายามเพิ่มวันที่ที่ผิดพลาดเช่น 30 กุมภาพันธ์ (ของปีใดก็ได้) เนื่องจากกุมภาพันธ์สามารถมีเพียง 29 วันในปีอธิกสุรทินและ 28 วันสำหรับปีอธิกสุรทินที่ไม่ใช่

ข้อ จำกัด การตรวจสอบ

นอกจากนี้ยังมีข้อ จำกัด ในการตรวจสอบความถูกต้องซึ่งสามารถนำไปใช้ในแหล่งข้อมูลได้เช่นทำให้แน่ใจว่าวันที่แทรกไม่เกินวันที่ปัจจุบันหรือวันที่เริ่มต้นเกิดขึ้นก่อนวันที่สิ้นสุด

การดำเนินงาน

ที่เก็บข้อมูลส่วนใหญ่ยังมีการใช้งาน / ฟังก์ชั่นเช่นDateAddหรือDatePartใน MS SQL Server สิ่งนี้ช่วยให้คุณสามารถเริ่มการกรองหรือเลือกข้อมูลที่เฉพาะเจาะจงในขณะที่ข้อมูลยังอยู่ในร้าน (ยังไม่ได้รับไปยังแอปพลิเคชัน)

รูปแบบที่ยอมรับในระดับสากล

ด้วยการใช้เนทีฟชนิดอื่น ๆ นักพัฒนาหรือระบบที่มีการโต้ตอบกับร้านค้าไม่จำเป็นต้องได้รับการแจ้งในรายละเอียดนาทีของวิธีการจัดเก็บประเภทดั้งเดิม นี่ไม่ใช่กรณีที่ประเภทนั้นถูกเก็บไว้เป็นสตริงดังนั้นคุณต้องแน่ใจว่าทุกคนเข้าใจรูปแบบของการDateTimeแทนค่าสตริงนั้น ระบบนี้จะเปราะบางเมื่อจัดการกับข้อมูลที่ครอบคลุมตำแหน่งที่ตั้งภูมิภาคและวัฒนธรรมในแหล่งกำเนิดข้อมูลที่ตั้งทางกายภาพของแอปพลิเคชันและคุณลักษณะของผู้ใช้ปลายทาง / ระบบที่มีปฏิสัมพันธ์กับข้อมูลนั้น ตัวอย่าง: รูปแบบวันที่ในประเทศหนึ่งอาจเป็น MM / dd / yyyy (เช่นในสหรัฐอเมริกา) แต่ในอีกรูปแบบหนึ่งอาจเป็น dd / MM / yyyy การตรวจจับความแตกต่างนั้นแทบจะเป็นไปไม่ได้เลย

ความเร็ว

ความเร็วในการดึงข้อมูลความเร็วในการตรวจสอบความเร็วของการดำเนินงานและประสิทธิภาพในการจัดเก็บล้วนเป็นปัจจัยที่สำคัญเช่นกัน ตัวอย่างความเร็วในการดึงข้อมูล: ที่เก็บข้อมูลอนุญาตให้จัดทำดัชนีในคอลัมน์และดัชนีเหล่านี้สามารถใช้งานได้อย่างมีประสิทธิภาพมากขึ้นหากจัดเก็บประเภทในรูปแบบดั้งเดิม

ใบสมัคร

การเข้าถึงข้อมูล

การดำเนินการแบบสอบถามกับที่จัดเก็บกลายเป็นเรื่องง่ายขึ้นโดยใช้ระบบชนิดเนทีฟเป็นผู้พัฒนาอีกครั้งไม่จำเป็นต้องเดาว่าเป็นรูปแบบการจัดเก็บข้อมูล ผู้ให้บริการแอปพลิเคชันที่เก็บข้อมูลเกือบทั้งหมด ( ตัวอย่าง: ado.net ) จัดเตรียมกลไกสำหรับการสร้างเคียวรีแบบกำหนดพารามิเตอร์ที่เหมาะสมตามชนิดเนทีฟที่ส่งผ่านนี่คือตัวอย่างของการเพิ่มส่วนวันที่ลงในเคียวรี ado.net กับที่เก็บเซิร์ฟเวอร์ sql การทำเช่นเดียวกันกับสตริงจะยุ่งยากและเปราะบาง / เกิดข้อผิดพลาดได้ง่าย

command.Parameters.Add(new SqlParameter("@startDate", SqlDbType.Date) {Value = myDateInstance.Date});

การดำเนินงาน

System.Dateประเภทพื้นเมืองในรหัสนอกจากนี้ยังจัดให้มีการดำเนินงานมาตรฐานเช่นประเภทสุทธิ โดยปกติการดำเนินการทางคณิตศาสตร์ในลักษณะเช่นการเพิ่มวันที่ค้นหาความแตกต่างระหว่างวันที่ ฯลฯ อีกครั้งนี้เป็นไปไม่ได้ที่จะทำอย่างง่ายดายในประเภทสตริง

เลเยอร์การนำเสนอ

สถานที่เกิดเหตุ

เมื่อชนิดดั้งเดิมถูกแปลงเป็นสตริงในเลเยอร์การนำเสนอ ( ตำแหน่งที่ถูกต้องในสแต็กโปรแกรมที่ต้องทำ ) ในตอนนี้โปรแกรมเมอร์มีตัวเลือกต่าง ๆ เพื่อแสดงอย่างถูกต้องตามบริบทที่แสดง บริบทนี้โดยทั่วไปประกอบด้วยความหมายที่แท้จริงของข้อมูลและสถานที่ของผู้ใช้

ตัวอย่างที่ 1

อินสแตนซ์ของวันที่และเวลาสามารถจัดรูปแบบอัตโนมัติตามสถานที่ของผู้ใช้

DateTime.Now.ToString("D", CultureInfo.GetCultureInfo(userContext.Culture))
ตัวอย่างที่ 2

อินสแตนซ์ทศนิยมอาจแสดงถึงจำนวน (สกุลเงิน) และสถานที่ของผู้ใช้ควรแสดงจำนวนตามการตั้งค่าของพวกเขา แอปพลิเคชัน c # อาจแสดงค่าโดยใช้

amount.ToString("C", CultureInfo.GetCultureInfo(userContext.Culture))

นี่อาจเป็นสิ่งสำคัญเนื่องจากวัฒนธรรมที่แตกต่างแสดงตัวเลขต่างกัน ในช่วงเวลาของสหรัฐอเมริกา (.) และเครื่องหมายจุลภาค (,) มีความหมายย้อนกลับที่แน่นอนเช่นเดียวกับในประเทศเนเธอร์แลนด์

ที่ตั้ง

นี่เป็นDateTimeกรณีที่เฉพาะเจาะจงมาก วันที่และเวลาแสดงให้เห็นถึงการเกิดขึ้นในช่วงเวลาที่เฉพาะเจาะจงในเวลา แต่มักจะต้องมีการถ่ายทอด / นำเสนอให้กับผู้ใช้ขึ้นอยู่กับโซนเวลาของตัวเอง ตัวอย่าง: สามารถแสดงDateTimeอินสแตนซ์สำหรับผู้ใช้ในเขตเวลาตะวันออกในสหรัฐอเมริกา มีหลายวิธีในการทำสิ่งนี้ให้สำเร็จ แต่มันจะเป็นไปไม่ได้เลยถ้าอินสแตนซ์เวลาวันที่จะถูกเก็บไว้ในหน่วยความจำในรูปแบบสตริงหรือในที่เก็บข้อมูลเป็นชนิดสตริง2016-09-21T23:38:21.399Z9/21/2016 5:21 PM


กฎทั่วไป

กฎทั่วไป 2 สำหรับแอปพลิเคชันจะตามมาเมื่อแปลงประเภทดั้งเดิมใด ๆ เป็นการแทนสตริงจะเป็นดังนี้

  • เมื่อยอมรับอินพุตแปลงอินพุตนั้นเป็นชนิดดั้งเดิมที่ถูกต้องให้เร็วที่สุดในสแต็กโปรแกรม (โดยปกติจะอยู่ในชั้นนำเสนอ)
  • เมื่อดึงข้อมูลที่จะแสดงให้แปลงข้อมูลนั้นเป็นสตริงแทนให้ช้าที่สุดในสแต็กโปรแกรม (อีกครั้งโดยปกติจะอยู่ในชั้นนำเสนอ)

0

ไม่มีอะไรผิดปกติในการทำเช่นนี้ (ทำตลอดเวลาในการให้บริการ) ตราบใดที่คุณใช้รูปแบบที่ไม่ชัดเจนสำหรับวันที่ของคุณ โดยไม่ต้องคลุมเครือฉันหมายถึงไม่เพียง แต่เป็นวันที่ชัดเจน (เช่น MM / DD เทียบกับ DD / MM) แต่ยังเป็นเขตเวลามันคืออะไรดังนั้นล่วงหน้าถ้าคุณจะแสดงวันที่ของคุณเป็นข้อความให้ใช้รูปแบบ ISO . ฉันชอบสตริงเวลาตาม UTC อย่างมาก

ข้อดี:

  • วันที่ / เวลาที่ได้มาตรฐานเป็นไปตามมาตรฐานแบบพกพาและเข้าใจง่าย
  • บ่อยครั้งที่วันที่ในฐานข้อมูลประกอบด้วยองค์ประกอบเวลา หากสิ่งนี้ไม่มีความหมายต่อข้อมูลของคุณสิ่งนี้สามารถทำให้สิ่งต่าง ๆ ง่ายขึ้นได้

จุดด้อย:

  • ขนาดข้อมูล รูปแบบภายในของวันที่ในฐานข้อมูลโดยทั่วไปจะใช้พื้นที่น้อยกว่าการแสดงผลสตริงของวันที่นั้น
  • โดยทั่วไปคุณจะต้องการให้มันเป็นโครงสร้างวันที่หรือเวลาจริงบนไคลเอนต์ดังนั้นอาจมีเวลาพิเศษในการแยกวิเคราะห์

หากมีคนพูดว่าพวกเขาต้องการทำสิ่งนี้ฉันจะถาม "ทำไม" เพราะมันไม่ได้ชี้ให้เห็นถึงมันมากนัก หากเหตุผลที่มีคนต้องการส่งคืนวันที่ในรูปแบบสตริงนั้นเป็นเพราะพวกเขาจะแสดงมันโดยตรงนี่ไม่ใช่เหตุผลที่ดีที่จะใช้ Strings จากฐานข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.