ฉันควรใช้ชนิดข้อมูลวันที่และเวลาหรือข้อมูลประทับเวลาใน MySQL หรือไม่


2685

คุณจะแนะนำให้ใช้วันที่และเวลาหรือการประทับเวลาฟิลด์และทำไม (ใช้ MySQL)?

ฉันทำงานกับ PHP ที่ฝั่งเซิร์ฟเวอร์


1
นี้มีข้อมูลที่เกี่ยวข้องcodeproject.com/Tips/1215635/MySQL-DATETIME-vs-TIMESTAMP
Waqleh

หากคุณต้องการให้ใบสมัครของคุณเสียในเดือนกุมภาพันธ์ 2038 ให้ใช้การประทับเวลา ตรวจสอบช่วงวันที่
Wilson Hauck

คำตอบ:


1829

โดยทั่วไป Timestamps ใน MySQL จะใช้เพื่อติดตามการเปลี่ยนแปลงของระเบียนและมักจะมีการปรับปรุงทุกครั้งที่มีการเปลี่ยนแปลงระเบียน หากคุณต้องการเก็บค่าเฉพาะคุณควรใช้เขตข้อมูลวันที่และเวลา

หากคุณหมายถึงว่าคุณต้องการที่จะตัดสินใจว่าจะใช้การประทับเวลา UNIX หรือฟิลด์ datetime MySQL ดั้งเดิมให้ไปกับรูปแบบเนทิฟ คุณสามารถทำการคำนวณภายใน MySQL ด้วยวิธีนี้ ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)")และเปลี่ยนรูปแบบของค่าเป็น UNIX timestamp ได้ง่าย("SELECT UNIX_TIMESTAMP(my_datetime)")เมื่อคุณค้นหาระเบียนถ้าคุณต้องการใช้งานด้วย PHP


981
ความแตกต่างที่สำคัญคือDATETIMEแสดงถึงวันที่ (เท่าที่พบในปฏิทิน) และเวลา (เท่าที่สามารถสังเกตได้ในนาฬิกาแขวนผนัง) ในขณะที่TIMESTAMPหมายถึงจุดที่กำหนดไว้ในเวลาที่ดี สิ่งนี้อาจสำคัญมากหากแอปพลิเคชันของคุณจัดการกับเขตเวลา นานแค่ไหนที่ผ่านมาคือ '2010-09-01 16:31:00'? มันขึ้นอยู่กับเขตเวลาที่คุณอยู่สำหรับฉันมันเป็นเพียงไม่กี่วินาทีที่ผ่านมาสำหรับคุณมันอาจเป็นตัวแทนของเวลาในอนาคต ถ้าผมพูด 1283351460 วินาทีตั้งแต่ '1970/01/01 00:00:00 UTC' คุณรู้ว่าสิ่งที่จุดในเวลาที่ฉันพูดคุยเกี่ยวกับ (ดูคำตอบที่ยอดเยี่ยมของ Nir ด้านล่าง) [ข้อเสีย: ช่วงที่ถูกต้อง]
MattBianco

121
ข้อแตกต่างอีกประการหนึ่ง: แบบสอบถามที่มี datetime "ดั้งเดิม" จะไม่ถูกแคช แต่แบบสอบถามที่มีการประทับเวลา - จะเป็น
OZ_

39
"การประทับเวลาใน MySQL โดยทั่วไปใช้เพื่อติดตามการเปลี่ยนแปลงของระเบียน" อย่าคิดว่าเป็นคำตอบที่ดี การประทับเวลามีประสิทธิภาพและซับซ้อนกว่านั้นมากเช่นเดียวกับ MattBianco และ Nir พูด แม้ว่าส่วนที่สองของคำตอบนั้นดีมาก มันเป็นความจริงสิ่งที่ blivet พูดและเป็นคำแนะนำที่ดี
santiagobasulto

10
หมายเหตุสำคัญ 1 ข้อ DATETIME และ TIMESTAMP สามารถใช้ CURRENT_TIMESTAMP, NOW () ด้วยความเคารพเนื่องจากเป็นค่าเริ่มต้น แต่ DATE ตัวอย่างเช่นไม่สามารถทำได้เนื่องจากใช้ '0000-00-00' เป็นค่าเริ่มต้นดังนั้นการแก้ปัญหาเรื่อง U จึงควรเขียน ทริกเกอร์ของคุณเองไปยังตารางนั้นเพื่อแทรกวันที่ปัจจุบัน (ไม่มีเวลา) ในฟิลด์ / col ด้วยประเภท DATE mysql
อาร์เธอร์ Kushman

14
@DavidHarkness: เอกสารระบุว่า "ในการระบุคุณสมบัติอัตโนมัติให้ใช้ DEFAULT CURRENT_TIMESTAMP และอนุประโยค UPDATE CURRENT_TIMESTAMP" dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
Plapap

917

ใน MySQL 5 ขึ้นไปค่าTIMESTAMPจะถูกแปลงจากเขตเวลาปัจจุบันเป็น UTC เพื่อจัดเก็บและแปลงกลับจาก UTC เป็นโซนเวลาปัจจุบันเพื่อดึงข้อมูล (นี้เกิดขึ้นเฉพาะสำหรับชนิดข้อมูลการลงเวลาและไม่ได้ประเภทอื่น ๆ เช่น DATETIME.)

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


11
งานนำเสนอ OReilly นี้ดีมากสำหรับหัวข้อนี้ (PDF ขออภัย) cdn.oreillystatic.com/th/assets/1/event/36/…
gcb

13
มันเกี่ยวกับลักษณะของเหตุการณ์: - การประชุมทางวิดีโอ (TIMESTAMP) ผู้เข้าร่วมทุกคนควรเห็นการอ้างอิงถึงการปรับเวลาทันทีทันใดของเวลา - เวลางานท้องถิ่น (DATETIME) ฉันควรทำงานนี้ที่ 2014/03/31 9:00 น. ไม่ว่าวันนั้นฉันจะทำงานที่นิวยอร์กหรือปารีส ฉันจะเริ่มทำงานเวลา 8:00 น. ตามเวลาท้องถิ่นฉันจะเป็นวันนั้น
yucer

1
ดังนั้นหากฉันเปลี่ยนเขตเวลาของเซิร์ฟเวอร์ค่าของ TIMESTAMP จะยังคงเหมือนเดิมหรือเปลี่ยนแปลงหรือไม่
Andrew

3
@ แอนดรูว์เนื่องจากเป็น UTC มันจะยังคงอยู่ UTC การแปลงย้อนหลังจะเปลี่ยนเป็นเขตเวลาของเซิร์ฟเวอร์ "ใหม่" อย่างไรก็ตาม
nembleton

@ yucer - ฉันไม่แนะนำให้คิดแบบนั้น การใช้งานที่สอดคล้องกันมากที่สุดในเศรษฐกิจโลกคือการแปลงชุดข้อมูลทั้งหมดเป็น UTC เพื่อจัดเก็บ ตามแบบแผนรักษา Datetime เป็นฟิลด์ UTC สิ่งนี้ทำให้ภาระกับงานทั้งหมดที่อินพุตชุดข้อมูลเพื่อทำการแปลงเป็น UTC แต่เป็นการออกแบบที่สะอาดขึ้นในระยะยาว แน่นอนนำเสนอข้อมูลให้กับผู้ใช้ตามการตั้งค่าปัจจุบันของพวกเขา หากผู้ใช้ต้องการป้อน "09:00 ในปารีส" จากนั้นให้พวกเขาตั้งเวลาปารีสจากนั้นป้อน 09:00 จากนั้นทุกคนที่อยู่ในนิวยอร์กจะสามารถค้นหาเวลาที่พวกเขาต้องการที่จะตื่นในเวลาของพวกเขาเพื่อการประชุมทางไกล
ToolmakerSteve

524

ฉันมักจะใช้เขตข้อมูล DATETIME เพื่อสิ่งอื่นที่ไม่ใช่ข้อมูลเมตาแถว (วันที่สร้างหรือแก้ไข)

ตามที่กล่าวไว้ในเอกสาร MySQL:

ประเภท DATETIME จะใช้เมื่อคุณต้องการค่าที่มีทั้งข้อมูลวันที่และเวลา MySQL ดึงและแสดงค่า DATETIME ในรูปแบบ 'YYYY-MM-DD HH: MM: SS' ช่วงที่รองรับคือ '1000-01-01 00:00:00' ถึง '9999-12-31 23:59:59'

...

ประเภทข้อมูล TIMESTAMP มีช่วง '1970-01-01 00:00:01' UTC ถึง '2038-01-09 03:14:07' UTC มันมีคุณสมบัติที่แตกต่างกันขึ้นอยู่กับรุ่น MySQL และโหมด SQL ที่เซิร์ฟเวอร์กำลังทำงาน

คุณมีแนวโน้มที่จะถึงขีด จำกัด ล่างของ TIMESTAMP ในการใช้งานทั่วไป - เช่นการจัดเก็บวันเกิด


195
คุณยังสามารถกดบนขีด จำกัด ได้อย่างง่ายดายถ้าคุณอยู่ในธนาคารหรืออสังหาริมทรัพย์จำนอง ... 30 ปีไปไกลกว่า 2,038 ตอนนี้
กีบ

16
แน่นอนใช้การประทับเวลา Unix 64 บิต ตัวอย่างเช่นใน Java new Date().getTime()ให้ค่า 64 บิตแล้ว
osa

5
+1 สำหรับ DATETIME: ในการไหลของข้อมูลของเราจาก SQL Server ของร้านค้าทางกายภาพสำหรับการซื้อและใบแจ้งหนี้โอนไปยังเซิร์ฟเวอร์ MySQL สำหรับร้านค้าเสมือนจริงบนหน้าเว็บ DATETIME จะดีกว่าสำหรับการปรับเปลี่ยนวันที่เวลา -SQL แต่ TIMESTAMP หมายถึงสิ่งอื่น ๆ ใน Transact-SQL มันเป็นแบบไบนารีเช่น ROWVERSION แม้ว่า MySQL TIMESTAMP จะเป็น DateTime ที่คล้ายกัน ดังนั้นเราจึงหลีกเลี่ยงการใช้ TIMESTAMP สำหรับความเข้ากันได้ของสองฐานข้อมูล
jacouh

10
ไม่มีความเห็น. มันเป็นปัญหาที่ใหญ่กว่าแค่ MySQL และไม่มีการแก้ปัญหาง่าย ๆ : en.wikipedia.org/wiki/Year_2038_problemฉันไม่เชื่อว่า MySQL สามารถประกาศเวลาปัจจุบันได้แบบ 64 บิตและคิดว่าทุกอย่างจะดี พวกเขาไม่ได้ควบคุมฮาร์ดแวร์
scronide

5
วันเกิดสามารถเป็น DATETIME หากคุณรู้เวลาที่เกิดเช่นเดียวกับฉัน
Kris Craig

322

ตัวอย่างด้านล่างแสดงให้เห็นว่าTIMESTAMPประเภทวันที่มีการเปลี่ยนแปลงค่าหลังจากการเปลี่ยนแปลงtime-zone to 'america/new_york'ที่DATETIMEมีการเปลี่ยนแปลง

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

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


55
จริงๆแล้วDATETIMEเวลาที่มีผลมีการเปลี่ยนแปลงกับการเปลี่ยนเขตเวลาTIMESTAMPก็ไม่ได้เปลี่ยนไป
flindeberg

3
ดูเหมือนว่าคำสั่งนี้จะไม่ทำงานใน MySQL 5.6 set time_zone="america/new_york";
Manjunath Reddy

นี่คือคำตอบสำหรับปัญหา time_zone ที่ตั้งไว้ stackoverflow.com/questions/3451847/mysql-timezone-change
Manjunath Reddy

2
เห็นด้วยกับ @flindeberg การประทับเวลาแสดงเวลาที่ถูกต้องไม่ใช่วันที่และเวลาหลังจากเปลี่ยนเขตเวลา
Nitin Bansal

193

ข้อแตกต่างที่สำคัญคือ DATETIME คงที่ในขณะที่ TIMESTAMP ได้รับผลกระทบจากการtime_zoneตั้งค่า

ดังนั้นจึงเป็นเรื่องสำคัญเมื่อคุณมี - หรือในอนาคตมี - ซิงโครไนซ์กลุ่มข้ามเขตเวลา

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

ตัวอย่างที่ดีของการใช้ DATETIME ที่ควรใช้ TIMESTAMP ใน Facebook ซึ่งเซิร์ฟเวอร์ของพวกเขาไม่แน่ใจว่าสิ่งใดที่เกิดขึ้นในเขตเวลา เมื่อผมได้มีการสนทนาในเวลาที่บอกว่าผมได้รับการตอบกลับข้อความก่อนที่ข้อความถูกส่งจริง (แน่นอนว่าสิ่งนี้อาจเกิดจากการแปลโซนเวลาที่ไม่ดีในซอฟต์แวร์การส่งข้อความหากมีการโพสต์เวลาแทนการซิงโครไนซ์)


83
ฉันไม่คิดว่านี่เป็นวิธีที่ดีในการคิด ฉันจะเก็บและประมวลผลวันที่ทั้งหมดใน UTC และตรวจสอบให้แน่ใจว่าส่วนหน้าแสดงตามโซนเวลาที่กำหนด วิธีนี้ง่ายและคาดการณ์ได้
Kos

8
@Kos: ไม่ได้จัดเก็บและประมวลผลวันที่ทั้งหมดใน UTC ตรงเวลาที่ TIMESTAMP กำลังทำอยู่ภายใน? (จากนั้นแปลงให้แสดงเขตเวลาท้องถิ่นของคุณหรือไม่)
carbocation

10
เขตเวลาท้องถิ่นของฉัน DB ของคุณจะรู้จักเขตเวลาของฉันอย่างไร ;-) โดยปกติจะมีการประมวลผลค่อนข้างน้อยระหว่างฐานข้อมูลและส่วนต่อประสานผู้ใช้ ฉันแปลเป็นภาษาท้องถิ่นหลังจากการประมวลผลทั้งหมด
Kos

3
@Koz: ฐานข้อมูลของฉันไม่ทราบฐานข้อมูลของคุณเขตเวลา:! แต่มันจะรู้การประทับเวลา ฐานข้อมูลของคุณรู้การตั้งค่าเขตเวลาของตัวเองและนำไปใช้เมื่อตีความ / เป็นตัวแทนของการประทับเวลา 01:01 น. วันที่ 11 ธันวาคม 2013 ที่ปักกิ่งประเทศจีนไม่ได้เป็นช่วงเวลาเดียวกับเวลา 1:01 น. วันที่ 11 ธันวาคม 2013 ที่ซิดนีย์ออสเตรเลีย Google: 'เขตเวลา' และ 'ช่วงเวลาสำคัญ'
ekerner

2
MySQL จะแปลงค่า TIMESTAMP จากเขตเวลาปัจจุบันเป็น UTC เพื่อจัดเก็บและย้อนกลับจาก UTC ไปยังเขตเวลาปัจจุบันเพื่อดึงข้อมูล (สิ่งนี้ไม่ได้เกิดขึ้นสำหรับประเภทอื่น ๆ เช่น DATETIME) dev.mysql.com/doc/refman/5.5/en/datetime.html
Mahdyfo

125

ฉันตัดสินใจบนฐานความหมาย

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

ฉันใช้ฟิลด์ datetime เมื่อสามารถตั้งค่าและเปลี่ยนวันที่ / เวลาได้ตามใจชอบ ตัวอย่างเช่นเมื่อผู้ใช้สามารถบันทึกการเปลี่ยนแปลงการนัดหมายในภายหลัง


เวลาประทับที่แน่นอนในเวลา, เวลาสากลเชิงพิกัดเวลา - สัมพันธ์กับมุมมอง, เพื่อการอ้างอิงเวลา (เวลาท้องถิ่น ej เขตเวลา), อาจเป็น .. เวลาท้องถิ่นเชิงพิกัดหรือไม่
yucer

110

ฉันขอแนะนำให้ใช้ทั้งฟิลด์ DATETIME หรือ TIMESTAMP หากคุณต้องการเป็นตัวแทนของวันใดวันหนึ่งโดยเฉพาะ (เช่นวันเกิด) ให้ใช้ประเภท DATE แต่ถ้าคุณเจาะจงมากกว่านั้นคุณอาจสนใจบันทึกช่วงเวลาที่เกิดขึ้นจริงซึ่งตรงข้ามกับหน่วยของ เวลา (วัน, สัปดาห์, เดือน, ปี) แทนที่จะใช้ DATETIME หรือ TIMESTAMP ให้ใช้ BIGINT และเพียงเก็บจำนวนมิลลิวินาทีนับตั้งแต่ยุค (System.currentTimeMillis () หากคุณใช้ Java) นี่มีข้อดีหลายประการ:

  1. คุณหลีกเลี่ยงการล็อคอินของผู้ขาย ค่อนข้างทุกฐานข้อมูลรองรับจำนวนเต็มในรูปแบบที่ค่อนข้างคล้ายกัน สมมติว่าคุณต้องการย้ายไปยังฐานข้อมูลอื่น คุณต้องการกังวลเกี่ยวกับความแตกต่างระหว่างค่า DATETIME ของ MySQL และวิธีที่ Oracle กำหนดค่าเหล่านั้นหรือไม่ แม้ใน MySQL เวอร์ชันต่าง ๆ TIMESTAMPS ก็มีระดับความแม่นยำที่แตกต่างกัน เป็นเพียงเมื่อเร็ว ๆ นี้ที่ MySQL รองรับมิลลิวินาทีในการประทับเวลา
  2. ไม่มีปัญหาเกี่ยวกับเขตเวลา มีการแสดงความคิดเห็นที่ลึกซึ้งเกี่ยวกับสิ่งที่เกิดขึ้นกับเขตเวลาด้วยประเภทข้อมูลที่แตกต่างกัน แต่นี่เป็นความรู้ทั่วไปและเพื่อนร่วมงานของคุณทุกคนจะใช้เวลาเรียนรู้หรือไม่? ในทางตรงกันข้ามมันค่อนข้างยากที่จะเกิดความสับสนในการเปลี่ยน BigINT ให้เป็น java.util.Date การใช้ BIGINT ทำให้เกิดปัญหามากมายเกี่ยวกับเขตเวลาที่จะตกอยู่ข้างทาง
  3. ไม่ต้องกังวลเกี่ยวกับช่วงหรือความแม่นยำ คุณไม่ต้องกังวลเกี่ยวกับสิ่งที่ถูกตัดให้สั้นลงตามช่วงวันที่ในอนาคต (TIMESTAMP ไปที่ 2038 เท่านั้น)
  4. การรวมเครื่องมือของบุคคลที่สาม โดยใช้จำนวนเต็มมันเป็นเรื่องเล็กน้อยสำหรับเครื่องมือของบุคคลที่สาม (เช่น EclipseLink) เพื่อเชื่อมต่อกับฐานข้อมูล ไม่ใช่เครื่องมือของบุคคลที่สามทุกคนที่จะมีความเข้าใจเหมือนกันกับ "วันที่และเวลา" เช่นเดียวกับ MySQL ต้องการลองและคิดออกในไฮเบอร์เนตว่าคุณควรใช้วัตถุ java.sql.TimeStamp หรือ java.util.Date ถ้าคุณใช้ประเภทข้อมูลที่กำหนดเองเหล่านี้หรือไม่ การใช้ประเภทข้อมูลพื้นฐานของคุณทำให้การใช้งานกับเครื่องมืออื่น ๆ เป็นเรื่องเล็กน้อย

ปัญหานี้เกี่ยวข้องอย่างใกล้ชิดกับวิธีเก็บค่าเงิน (เช่น $ 1.99) ในฐานข้อมูล คุณควรใช้ทศนิยมหรือประเภทเงินของฐานข้อมูลหรือแย่ที่สุดของ Double ทั้งหมดหรือไม่ ทั้งสามตัวเลือกเหล่านี้แย่มากด้วยเหตุผลหลายประการที่กล่าวไว้ข้างต้น วิธีแก้ไขคือการเก็บค่าเงินเป็นเซ็นต์โดยใช้ BIGINT แล้วแปลงเซนต์เป็นดอลลาร์เมื่อคุณแสดงมูลค่าให้กับผู้ใช้ งานของฐานข้อมูลคือการจัดเก็บข้อมูลและไม่ให้บุกรุกข้อมูลนั้น ประเภทข้อมูลแฟนซีเหล่านี้ทั้งหมดที่คุณเห็นในฐานข้อมูล (โดยเฉพาะอย่างยิ่ง Oracle) เพิ่มเล็กน้อยและเริ่มต้นคุณสู่การล็อคอินผู้ขาย


12
ฉันชอบวิธีนี้ TIMESTAMP ที่หมดอายุในปี 2581 เป็นปัญหาสำคัญ นั่นไม่ไกลนัก!
Charlie Dalsass

4
@ CharlieDalsass คุณคิดว่าซอฟต์แวร์ปัจจุบันจะมีเวลานั้น :-P
Habeeb Perwad

13
มันทำให้การสืบค้นข้อมูลตามวันที่เป็นเรื่องยากหากเก็บไว้เป็นมิลลิวินาที
Ali Saeed

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

4
ทางออกที่ดีเยี่ยม! และคุณถูกต้อง abt ถูก "ล็อค" เมื่อคุณมีนิสัยชอบปล่อยให้คนอื่น "ทำงานให้คุณ" คุณจะเริ่มสูญเสียบิตและชิ้นส่วนที่ทำให้คุณเป็นโปรแกรมเมอร์
fmc

98

TIMESTAMP คือ 4 ไบต์ Vs 8 ไบต์เป็นเวลา DATETIME

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

แต่เช่นเดียวกับ scronide บอกว่ามันมีขีด จำกัด ที่ต่ำกว่าของปี 1970 มันยอดเยี่ยมสำหรับทุกสิ่งที่อาจเกิดขึ้นในอนาคตแม้ว่า;)


185
อนาคตจะสิ้นสุดลงที่ 2038-01-19 03:14:07 UTC
MattBianco

5
ที่โง่. ฉันคิดว่าประเภท TIMESTAMP จะเป็น "อนาคตพร้อม" เพราะเป็นสิ่งที่ค่อนข้างใหม่ คุณไม่สามารถแปลงข้อมูลเวลาเป็น UTC และกลับมาทุกครั้งเมื่อคุณทำงานกับเขตเวลาที่แตกต่างกัน พวกเขาควรทำให้ TIMESTAMP ใหญ่ขึ้น .. อย่างน้อย 1 ไบต์ มันจะเพิ่ม 68 * 255 = 17340 อีกปี ... แม้ว่ามันจะไม่ได้รับการจัดแนว 32 บิต
NickSoft

10
คุณรู้หรือไม่ว่าทำไม TIMESTAMP ถึงสิ้นสุดในปี 2038 เพราะมันเป็นจำนวนเต็มและจำนวนเต็มมีขีด จำกัด คือ 2147483647 ฉันคิดว่านี่เป็นเหตุผล อาจเป็นหากพวกเขาเปลี่ยนประเภทเป็น varchar และเปลี่ยนวิธีการจัดการมันจะเป็น "อนาคตพร้อม"
vinsa

6
@ vinsa ฉันไม่คิดว่ามันจะพร้อมในอนาคต ยังจำข้อผิดพลาด Y2K ได้หรือไม่ 2581
Pacerier

2
ภายในปี 2038, MySQL (ถ้ายังคงมีอยู่) จะอัปเดตฟิลด์ TIMESTAMP เพื่อใช้มากกว่า 4 ไบต์และอนุญาตให้มีช่วงกว้างขึ้น
the_nuts

95
  1. TIMESTAMP คือสี่ไบต์เทียบกับแปดไบต์สำหรับ DATETIME

  2. Timestamps ยังเบาในฐานข้อมูลและจัดทำดัชนีได้เร็วขึ้น

  3. ประเภท DATETIME จะใช้เมื่อคุณต้องการค่าที่มีทั้งข้อมูลวันที่และเวลา MySQL ดึงและแสดงค่า DATETIME ในรูปแบบ 'YYYY-MM-DD HH: MM: SS' ช่วงที่รองรับคือ '1000-01-01 00:00:00′ ถึง '9999-12-31 23:59:59′

ประเภทข้อมูล TIMESTAMP มีช่วง '1970-01-01 00:00:01′ UTC ถึง '2038-01-09 03:14:07′ UTC มันมีคุณสมบัติที่แตกต่างกันขึ้นอยู่กับรุ่น MySQL และโหมด SQL ที่เซิร์ฟเวอร์กำลังทำงาน

  1. DATETIME เป็นค่าคงที่ในขณะที่ TIMESTAMP ได้รับผลกระทบจากการตั้งค่า time_zone

6
คุณต้องชี้แจง # 4: การประทับเวลาเนื่องจากเก็บไว้เป็นค่าคงที่และไม่สัมพันธ์กัน (ไม่เชื่อเรื่องพระเจ้าอย่างสมบูรณ์) กับเขตเวลาในขณะที่ผลลัพธ์ที่แสดงเมื่อดึงข้อมูลได้รับผลกระทบจากเขตเวลาของเซสชันที่ร้องขอ DATETIME สัมพันธ์กับเขตเวลาที่บันทึกไว้เสมอและจะต้องได้รับการพิจารณาในบริบทนั้นเสมอซึ่งเป็นความรับผิดชอบที่อยู่ในแอปพลิเคชัน
Christopher McGowan

1
คำตอบที่ดี หากต้องการเพิ่มคำตอบนี้หากเราพยายามเก็บค่าเกินกว่า '2038-01-09 03:14:07' เราอาจได้รับข้อผิดพลาดหรือได้รับการจัดเก็บเป็น '0000-00-00 00:00:00' ฉันได้รับข้อผิดพลาดนี้สำหรับฐานข้อมูลของฉันเนื่องจากมีค่าการเปลี่ยนเวลา (สำหรับวัตถุประสงค์ในการเข้ารหัส)
KarthikS

นอกจากนี้ยังมีปัญหาเกี่ยวกับ DATETIME ด้วยค่าเริ่มต้นสำหรับรุ่นของ mysql ต่ำกว่า 5.5 dba.stackexchange.com/questions/132951/…
Velaro

47

ขึ้นอยู่กับแอพพลิเคชั่นจริงๆ

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

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

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

Timestamps ยังเบาในฐานข้อมูลและจัดทำดัชนีได้เร็วขึ้น


แอปพลิเคชันของคุณไม่ควรขึ้นอยู่กับเขตเวลาของเซิร์ฟเวอร์ การประยุกต์ใช้ควรเลือกเขตเวลาในเซสชั่นของการเชื่อมต่อฐานข้อมูลจะใช้ก่อนที่จะออกแบบสอบถามใด ๆ หากการเชื่อมต่อมีการใช้งานร่วมกันระหว่างผู้ใช้หลายคน (เช่น webapp) ให้ใช้ UTC และทำการแปลงเขตเวลาในด้านการแสดงผล
dolmen

42

2016 + : สิ่งที่ฉันแนะนำคือการตั้งค่าเขตเวลา Mysql ของคุณเป็น UTC และใช้ DATETIME:

เฟรมเวิร์กส่วนหน้าล่าสุด (Angular 1/2, react, Vue, ... ) สามารถแปลง datetime UTC ของคุณเป็นเวลาท้องถิ่นและอัตโนมัติ

นอกจากนี้:

(เว้นแต่คุณจะเปลี่ยนเขตเวลาของเซิร์ฟเวอร์ของคุณ)


ตัวอย่างกับ AngularJs

// back-end: format for angular within the sql query
SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")...

// font-end Output the localised time
{{item.my_datetime | date :'medium' }}

รูปแบบเวลาท้องถิ่นทั้งหมดมีให้ที่นี่: https://docs.angularjs.org/api/ng/filter/date


8
ข้อมูลของคุณไม่ควรแนบกับการตั้งค่าเขตเวลาของเซิร์ฟเวอร์ของคุณ บางทีมันอาจใช้ได้ผลกับคุณถ้าคุณมีกล่อง MySql กล่องเดียวใต้โต๊ะของคุณ
จิน

@Jin UTC หมายถึงไม่มีเขตเวลาเหมือน TIMESTAMP หากเซิร์ฟเวอร์ทั้งหมดของคุณอยู่ใน UTC จะไม่มีปัญหา อาจจะไม่ทำงานสำหรับคุณถ้าคุณมีการกำหนดค่าของปี 2000
Sebastien Horin

TIMESTAMP อาจได้รับการอัพเกรดเป็น 64 บิตในอนาคต ไม่มีปัญหาอีกแล้ว
doublejr

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

1
อย่าพึ่งพาแอปพลิเคชันของคุณใน time_zone ของเซิร์ฟเวอร์ แทนที่จะกำหนด time_zone เพื่อใช้ในการเชื่อมต่อฐานข้อมูลแต่ละครั้ง: SET time_zone = '+0:00';สำหรับ UTC
dolmen

37

timestampฟิลด์เป็นกรณีพิเศษของdatetimeข้อมูล คุณสามารถสร้างtimestampคอลัมน์เพื่อให้มีคุณสมบัติพิเศษ สามารถตั้งค่าให้อัปเดตตัวเองได้ทั้งสร้างและ / หรืออัปเดต

ในเงื่อนไขฐานข้อมูล "ใหญ่ขึ้น" timestampมีทริกเกอร์กรณีพิเศษสองสามข้อ

สิ่งที่ถูกต้องขึ้นอยู่กับสิ่งที่คุณต้องการทำ


6
ไม่ความแตกต่างไม่ใช่แค่ "กรณีพิเศษ" เนื่องจากเขตเวลาของเซสชันที่ตั้งค่า / สืบค้นค่าต่าง ๆ จะเกี่ยวข้องกัน
dolmen

ฉันดีใจที่คุณใส่ "สิ่งที่ถูกต้องขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ" มีคำตอบมากเกินไปใน SE ซึ่งไม่มีเหตุผลเพียงพอ "คุณต้องไม่ทำ X" หรือ "คุณต้องทำ Y เสมอ "
Agi Hammerthief

37

TIMESTAMP อยู่ใน UTC เสมอ (นั่นคือวินาทีที่ผ่านไปตั้งแต่ 1970-01-01 ใน UTC) และเซิร์ฟเวอร์ MySQL ของคุณจะแปลงเป็นวันที่ / เวลาสำหรับเขตเวลาการเชื่อมต่อโดยอัตโนมัติ ในระยะยาว TIMESTAMP เป็นหนทางไปเพราะคุณรู้ว่าข้อมูลทางโลกของคุณจะอยู่ใน UTC เสมอ ตัวอย่างเช่นคุณจะไม่พลาดวันที่ถ้าคุณย้ายไปที่เซิร์ฟเวอร์อื่นหรือหากคุณเปลี่ยนการตั้งค่าเขตเวลาในเซิร์ฟเวอร์ของคุณ

หมายเหตุ: เขตเวลาการเชื่อมต่อเริ่มต้นคือเขตเวลาของเซิร์ฟเวอร์ แต่สิ่งนี้สามารถ (ควร) เปลี่ยนแปลงในแต่ละเซสชัน (ดูSET time_zone = ...)


29

การเปรียบเทียบระหว่าง DATETIME, TIMESTAMP และ DATE

ป้อนคำอธิบายรูปภาพที่นี่

[.fraction] คืออะไร

  • ค่า DATETIME หรือ TIMESTAMP สามารถรวมส่วนของเศษเสี้ยววินาทีต่อท้ายในความแม่นยำสูงถึง microseconds (6 หลัก) โดยเฉพาะอย่างยิ่งส่วนที่เป็นเศษส่วนใด ๆ ในค่าที่แทรกลงในคอลัมน์ DATETIME หรือ TIMESTAMP จะถูกเก็บไว้แทนที่จะถูกทิ้ง แน่นอนว่าเป็นตัวเลือก

แหล่งที่มา:


24

ฉันมักจะใช้เวลา Unix เมื่อทำงานกับ MySQL และ PHP เหตุผลหลักในการนี้เป็นวิธีวันที่เริ่มต้นใน PHP ใช้การประทับเวลาเป็นพารามิเตอร์ดังนั้นจึงไม่จำเป็นต้องแยกวิเคราะห์

ที่จะได้รับการประทับเวลา Unix ในปัจจุบัน PHP, เพียงแค่ทำtime();
และ MySQL SELECT UNIX_TIMESTAMP();ทำ


6
-1 ฉันคิดว่าคำตอบด้านล่างนั้นดีกว่า - การใช้วันที่และเวลาช่วยให้คุณสามารถเพิ่มตรรกะสำหรับการประมวลผลวันที่ลงใน MySQL ได้เองซึ่งมีประโยชน์มาก
Toby Hede

ยังไม่มีการเปรียบเทียบแสดงให้เห็นว่าการเรียงลำดับใน MySQL จะช้ากว่าใน PHP?
sdkfasldf

มันขึ้นอยู่กับว่าบางครั้งมันก็ดีที่จะใช้เมื่อเราไม่ชอบใช้สโตโตไทม์ (php5.3 dep)
Adam Ramadhan

คุณสามารถผลักดันตรรกะเข้า MySQL โดยเพียงแค่ใช้ FROM_UNIXTIME ถ้าจำเป็น
inarilo

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

24

เป็นที่น่าสังเกตใน MySQL คุณสามารถใช้บางสิ่งบางอย่างตามบรรทัดด้านล่างเมื่อสร้างคอลัมน์ตารางของคุณ:

on update CURRENT_TIMESTAMP

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


17

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

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

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

ALTER TABLE your_table
      MODIFY COLUMN ts_activity TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

15

ชนิดข้อมูลประทับเวลาเก็บวันที่และเวลา แต่ในรูปแบบ UTC ไม่ใช่ในรูปแบบเขตเวลาปัจจุบันเช่นเดียวกับวันที่และเวลา และเมื่อคุณดึงข้อมูลการประทับเวลาอีกครั้งจะแปลงเป็นเวลาเขตเวลาปัจจุบัน

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

สำหรับรายละเอียดเพิ่มเติมคุณสามารถอ่านบล็อกโพสต์ประทับเวลา Vs วันที่และเวลา


คุณสามารถ (ควร) กำหนดเขตเวลาที่ระดับเซสชันด้วยSET time_zone = '+0:00';(UTC ที่นี่) เสมอเพื่อให้แน่ใจว่าคุณได้รับ / ตั้งค่าจากTIMESTAMPค่าใดและหลีกเลี่ยงขึ้นอยู่กับค่าเริ่มต้น time_zone ของเซิร์ฟเวอร์ซึ่งอาจเปลี่ยนแปลงได้
dolmen

14

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

อีกสิ่งที่ควรพิจารณา:

หากคุณกำลังสร้างแอปพลิเคชันคุณจะไม่มีทางรู้ว่าข้อมูลของคุณจะต้องถูกนำไปใช้อย่างไร หากคุณต้องพูดพูดเปรียบเทียบบันทึกจำนวนมากในชุดข้อมูลของคุณด้วยพูดรายการมากมายจาก API ของบุคคลที่สามแล้วพูดว่าวางลำดับตามลำดับคุณจะมีความสุขที่ได้ Unix timestamps สำหรับแถวของคุณ แม้ว่าคุณจะตัดสินใจที่จะใช้การประทับเวลา MySQL ให้เก็บการประทับเวลาของ Unix ไว้เป็นประกัน


14

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

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

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

ดังนั้นเพื่อสรุปฉันให้ความสำคัญกับข้อดีของการประทับเวลานี้:

  • พร้อมที่จะใช้กับแอพสากล (โซนเวลาหลายเขต)
  • การโยกย้ายง่ายระหว่างเขตเวลา
  • ค่อนข้างง่ายในการคำนวณความแตกต่าง (เพียงลบการประทับเวลาทั้งสอง)
  • ไม่ต้องกังวลเกี่ยวกับวันที่เข้า / ออกในช่วงฤดูร้อน

ด้วยเหตุผลทั้งหมดนี้ฉันเลือกฟิลด์ UTC และเวลาประทับที่เป็นไปได้ และฉันหลีกเลี่ยงอาการปวดหัว;)


ข้อมูลการประทับเวลาจะเป็นเรื่องสนุกสำหรับผู้ที่สนับสนุนใบสมัครของคุณเมื่อวันที่ 20 มกราคม 2038 tick tock tick tock
วิลสัน Hauck

ประเภทการประทับเวลาสามารถเพิ่มขึ้นได้อีกเล็กน้อยและเพิ่มค่าที่เป็นไปได้สองเท่า
Roger Campanera

ทดสอบทฤษฎีของคุณเพื่อ 'เพิ่มขึ้นเล็กน้อย' และดูว่าคุณสามารถจัดเก็บ 1 กุมภาพันธ์ 2038 และดึงข้อมูลด้วย MySQL ได้หรือไม่ โปรดดูคำนิยามตารางของคุณเมื่อเสร็จแล้ว คุณอาจจะมีคนรู้จักที่ไม่มีความสุขมากในเดือนกุมภาพันธ์ 2581
Wilson Hauck

1
@WilsonHauck คุณจะต้องอัพเกรดรุ่น MySQL ก่อนปี 2038 และ TIMESTAMP ที่ขยายเพิ่มนั้นจะได้รับการจัดการโดยการย้ายข้อมูล นอกจากนี้แอปพลิเคชั่นบางตัวที่นอกเหนือจากการจัดการกับการจำนองจำเป็นต้องมีการดูแลเกี่ยวกับ 2038 ในขณะนี้
dolmen

@dolmen เครื่องมือและวัสดุระดับมืออาชีพจำนวนมากมีการรับประกันมากกว่า 20 ปี ดังนั้นสิ่งที่ต้องการwarranties.expires_atไม่สามารถเป็นเวลาประทับ MySQL ได้ในวันนี้
alexw

13

ระวังการเปลี่ยนเวลาประทับเมื่อคุณทำคำสั่ง UPDATE บนโต๊ะ หากคุณมีตารางที่มีคอลัมน์ 'ชื่อ' (varchar), 'อายุ' (int) และ 'Date_Added' (การประทับเวลา) และคุณเรียกใช้คำสั่ง DML ต่อไปนี้

UPDATE table
SET age = 30

จากนั้นทุกค่าเดียวในคอลัมน์ 'Date_Added' ของคุณจะเปลี่ยนเป็นการประทับเวลาปัจจุบัน


3
ขึ้นอยู่กับวิธีการตั้งค่าตารางของคุณคุณสามารถควบคุมพฤติกรรมนี้ ดูที่dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html
Charles Faiga

5
@CharlesFaiga พฤติกรรมเริ่มต้นสำหรับการประทับเวลาที่จะอัปเดตเมื่อมีการปรับปรุงคอลัมน์อื่น ๆ คุณต้องปิดการใช้งานนี้อย่างชัดเจนหากคุณต้องการให้การประทับเวลาเพื่อรักษาค่าเดิมไว้
Lloyd Banks

นั่นคืออะไร ?! คุณต้องตั้งค่าคอลัมน์ timstamp เป็นON UPDATE CURRENT_TIMESTAMP
นักบัญชีเริ่ม

นี่คือคุณสมบัติที่คุณต้องเปิดใช้งานอย่างชัดเจนเมื่อสร้างตาราง
dolmen

13

การอ้างอิงที่นำมาจากบทความนี้:

ความแตกต่างหลัก:

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

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

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

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


11
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
|                                       TIMESTAMP                                       |                                 DATETIME                                 |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
| TIMESTAMP requires 4 bytes.                                                           | DATETIME requires 8 bytes.                                               |
| Timestamp is the number of seconds that have elapsed since January 1, 1970 00:00 UTC. | DATETIME is a text displays 'YYYY-MM-DD HH:MM:SS' format.                |
| TIMESTAMP supported range: 1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 UTC.    | DATETIME supported range: 1000-01-01 00:00:00 to 9999-12-31 23:59:59 |
| TIMESTAMP during retrieval converted back to the current time zone.                   | DATETIME can not do this.                                                |
| TIMESTAMP is used mostly for metadata i.e. row created/modified and audit purpose.    | DATETIME is used mostly for user-data.                                   |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+

10

ข้อแตกต่างอื่นระหว่างการประทับเวลาและวันที่และเวลาอยู่ในการประทับเวลาคุณไม่สามารถค่าเริ่มต้นเป็น NULL ได้


8
เห็นได้ชัดว่ามันผิด นี่คือตัวอย่าง: CREATE TABLE t2 ( ts1 TIMESTAMP NULL, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);คอลัมน์แรกสามารถยอมรับค่า NULL
Ormoz

10

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

มันสามารถติดตามข้ามเขตเวลาที่แตกต่างกันดังนั้นหากคุณต้องการแสดงเวลาที่สัมพันธ์กันเช่นเวลา UTC เป็นสิ่งที่คุณต้องการ


9

ความแตกต่างที่สำคัญคือ

ดูที่โพสต์นี้เพื่อดูปัญหาเกี่ยวกับการทำดัชนี Datetime


6
ทั้งคู่มีปัญหาเดียวกันหากคุณเลือกด้วยฟังก์ชั่นตามค่าคอลัมน์และทั้งสองสามารถทำดัชนีได้
Marcus Adams

4
ดัชนีทำงานบนเวลาและไม่สามารถใช้งานได้ในวันที่และเวลา? คุณได้ข้อสรุปที่ผิดจากการโพสต์เหล่านั้น
Salman A

9

ฉันหยุดใช้งานdatetimeในแอปพลิเคชันของฉันหลังจากประสบปัญหาและข้อบกพร่องมากมายที่เกี่ยวข้องกับเขตเวลา IMHO ใช้timestampจะดีกว่าdatetimeในส่วนของกรณีที่

เมื่อคุณถามเวลาอะไร และคำตอบนั้นมาในรูปแบบ '2019-02-05 21:18:30' ที่ยังไม่เสร็จไม่ได้กำหนดคำตอบเพราะมันขาดอีกส่วนหนึ่งในเขตเวลาใด วอชิงตัน มอสโก ปักกิ่ง

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

นี่คือบางกรณีที่จะทำให้คุณเสียใจที่ใช้งานdatetimeและต้องการให้คุณเก็บข้อมูลไว้ในการประทับเวลา

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

    SET time_zone = '+2:00';
  2. คุณเปลี่ยนประเทศที่คุณพำนักและดำเนินการบำรุงรักษาข้อมูลในขณะที่เห็นในเขตเวลาอื่น (โดยไม่ต้องเปลี่ยนข้อมูลจริง)

  3. คุณยอมรับข้อมูลจากลูกค้าที่แตกต่างกันทั่วโลกแต่ละคนจะแทรกเวลาในเขตเวลาของเขา

ในระยะสั้น

datetime = แอปพลิเคชั่นสนับสนุน 1 เขตเวลา (สำหรับการแทรกและการเลือก)

timestamp = แอปพลิเคชันรองรับเขตเวลาใดก็ได้ (สำหรับการแทรกและการเลือก)


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


จะเกิดอะไรขึ้นถ้ามีเขตข้อมูลที่ใช้dateและเขตข้อมูลอื่นใช้timestampในตารางเดียว ฉันคิดว่ามันจะทำให้เกิดปัญหาใหม่เพราะข้อมูลที่กรองโดยwhereไม่เป็นไปตามการเปลี่ยนแปลงของเขตเวลา
Erlang P

@ErlangP ในกรณีนั้นแอปพลิเคชันของคุณควรแก้ไขปัญหาเขตเวลาในdateคอลัมน์ก่อนส่งแบบสอบถาม
นักบัญชี

7

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



6

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

$date  = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now  - $result) / 60);
$min = round($unix_diff_min);

4
หรือใช้ฐานข้อมูล MySQL แบบมนุษย์ซึ่งสามารถ readeable และ Native ได้และใช้ฟังก์ชัน MySQL ดั้งเดิมเพื่อเพิ่ม / ลดชุดข้อมูลย่อย
Julien Palard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.