ใน Ruby on Rails อะไรคือความแตกต่างระหว่าง DateTime, Timestamp, เวลาและวันที่


414

จากประสบการณ์ของฉันการได้รับวันที่ / เวลาที่ถูกต้องเมื่อการเขียนโปรแกรมเต็มไปด้วยอันตรายและความแตกต่าง

Ruby และ Rails ทำให้ฉันหลงทางอยู่เสมอในกรณีนี้เนื่องจากมีตัวเลือกมากมาย ฉันไม่เคยมีความคิดใดที่ฉันควรเลือก

เมื่อฉันใช้ Rails และดู ActiveRecord datatypes ฉันสามารถค้นหาสิ่งต่อไปนี้

: datetime,: timestamp,: time และ: date

และไม่รู้ว่าอะไรคือความแตกต่างหรือที่ gotchas แฝงตัว

ความแตกต่างคืออะไร? คุณใช้มันเพื่ออะไร

(PS ฉันใช้ Rails3)

คำตอบ:


572

ความแตกต่างระหว่างรูปแบบวันที่ / เวลาที่แตกต่างกันใน ActiveRecord นั้นมีส่วนเกี่ยวข้องกับ Rails และทุกอย่างเกี่ยวกับฐานข้อมูลที่คุณใช้อยู่

ใช้ MySQL เป็นตัวอย่าง (ถ้าไม่มีเหตุผลอื่น ๆ เพราะมันเป็นที่นิยมมากที่สุด) คุณมีDATE, DATETIME, TIMEและTIMESTAMPชนิดข้อมูลคอลัมน์; เช่นเดียวกับที่คุณมีCHAR, VARCHAR, และFLOATINTEGER

ดังนั้นคุณถามอะไรคือความแตกต่าง บางคนอธิบายตนเองได้ DATEเก็บเฉพาะวันที่TIMEเท่านั้นเก็บช่วงเวลาของวันในขณะที่จัดDATETIMEเก็บทั้งสอง

ความแตกต่างระหว่างDATETIMEและTIMESTAMPเป็นบิตที่ลึกซึ้งยิ่งขึ้น: มีรูปแบบเป็นDATETIME YYYY-MM-DD HH:MM:SSช่วงที่ถูกต้องเริ่มจากปี 1,000 ถึงปี 9999 (และทุกอย่างในขณะที่TIMESTAMP ดูเหมือนว่าเมื่อคุณดึงมันออกมาจากฐานข้อมูลมันเป็นเพียงด้านหน้าสำหรับการประทับเวลายูนิกซ์ช่วงที่ถูกต้องของมันไปจาก 1970 ถึง 2038 ที่นี่นอกเหนือจากฟังก์ชั่นในตัวที่หลากหลายภายในเอ็นจิ้นฐานข้อมูลคือพื้นที่เก็บข้อมูลเนื่องจากDATETIMEเก็บทุกหลักในปีเดือนวันชั่วโมงนาทีและวินาทีมันจึงใช้ทั้งหมด 8 ไบต์TIMESTAMPเพียงเก็บตัวเลข วินาทีตั้งแต่ 1970-01-01 มันใช้ 4 ไบต์

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างรูปแบบในเวลาของ MySQL ที่นี่

ในที่สุดมันก็ลงมาที่สิ่งที่คุณต้องการคอลัมน์วันที่ / เวลาของคุณที่จะทำ คุณต้องการจัดเก็บวันที่และเวลาก่อนปี 1970 หรือหลังปี 2038 หรือไม่? DATETIMEใช้ คุณจำเป็นต้องกังวลเกี่ยวกับขนาดฐานข้อมูลและคุณอยู่ภายในช่วงเวลานั้นหรือไม่? TIMESTAMPใช้ คุณต้องการเก็บวันที่หรือไม่? DATEใช้ คุณต้องการเก็บเวลาหรือไม่? TIMEใช้

มีกล่าวทั้งหมดนี้Rails จริงทำให้บางส่วนของการตัดสินใจเหล่านี้สำหรับคุณ ทั้ง:timestampและ:datetimeจะเริ่มต้นDATETIMEในขณะที่:dateและ:timeสอดคล้องกับDATEและTIMEตามลำดับ

ซึ่งหมายความว่าภายใน Rails คุณต้องตัดสินใจว่าจะต้องเก็บวันที่เวลาหรือทั้งสองอย่าง


7
สำหรับบันทึกฉันชอบการประทับเวลาแบบสัมบูรณ์ (unix) เนื่องจากรูปแบบ YYYY-MM-DD ขึ้นอยู่กับเขตเวลาที่ใช้ ดังนั้นลูกค้าจำเป็นต้องรู้เขตเวลาของเซิร์ฟเวอร์และต้องทำการแปลง การประทับเวลาสัมบูรณ์วินาทีตั้งแต่ 1970 ไม่ได้มีปัญหานั้น
n13

32
@ n13 จุดที่ดี แต่ไม่ใช่ปัญหาใน Rails เนื่องจากแปลงเป็น UTC ก่อนที่จะแทรกชุดข้อมูลลงในฐานข้อมูล
vonconrad

13
นี่เป็นหนึ่งในกระทู้ที่เป็นประโยชน์ที่สุดในจักรวาล Rails ควรเพิ่มคู่มือราง ...
Andrew

4
TIMEคอลัมน์ของ MySQL ไม่ได้เป็น "เวลาของวัน" อย่างเคร่งครัดเพราะมันยอมรับชั่วโมง> 24; นอกจากนี้ยังสามารถใช้งานเป็น "เวลาที่ผ่านไป"
nickgrim

6
เป็นเช่นนี้ใน dbs อื่น ๆ ? เช่น postgres
Andy Hayden

24
  1. : วันที่และเวลา (8 ไบต์)

    • ร้านค้าวันที่และเวลาในรูปแบบ YYYY-MM-DD HH: MM: SS
    • มีประโยชน์สำหรับคอลัมน์อย่าง birth_date
  2. : การประทับเวลา (4 ไบต์)

    • เก็บจำนวนวินาทีตั้งแต่ 1970-01-01
    • มีประโยชน์สำหรับคอลัมน์เช่น updated_at, created_at
  3. : วันที่ (3 ไบต์)
    • ร้านค้าวันที่
  4. : เวลา (3 ไบต์)
    • ร้านค้าเวลา

3
นี่เป็นเหมือนคำตอบที่ได้รับการยอมรับข้างต้นเวอร์ชัน TL: DR
Chidozie Nnachor

0

นี่คือคำอธิบายที่ยอดเยี่ยมและแม่นยำที่ฉันพบ

TIMESTAMP ใช้ในการติดตามการเปลี่ยนแปลงของบันทึกและอัพเดททุกครั้งเมื่อมีการเปลี่ยนแปลงบันทึก DATETIME ใช้เพื่อเก็บค่าเฉพาะและค่าคงที่ซึ่งไม่ได้รับผลกระทบจากการเปลี่ยนแปลงใด ๆ ในระเบียน

TIMESTAMP ยังได้รับผลกระทบจากการตั้งค่าที่เกี่ยวข้องกับ TIME ZONE DATETIME คงที่

TIMESTAMP แปลงโซนเวลาปัจจุบันภายในเป็น UTC สำหรับจัดเก็บข้อมูลภายในและระหว่างการดึงข้อมูลแปลงกลับเป็นโซนเวลาปัจจุบัน DATETIME ไม่สามารถทำได้

TIMESTAMP คือ 4 ไบต์และ DATETIME คือ 8 ไบต์

ช่วงเวลาที่รองรับ TIMESTAMP: '1970-01-01 00:00:01 to UTC ถึง' 2038-01-19 03:14:07 ′ช่วงเวลาที่รองรับ UTC DATETIME:' 1000-01-01 00:00:00 ′ถึง' 9999 -12-31 23:59:59 ′

แหล่งที่มา: https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant

นอกจากนี้ยัง ...

ตารางที่มีคอลัมน์ "วันที่" ประเภทที่แตกต่างกันและประเภทการย้ายรางที่สอดคล้องกันขึ้นอยู่กับฐานข้อมูล

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