MySQL: วิธีรับความแตกต่างระหว่างการประทับเวลาสองครั้งในไม่กี่วินาที


102

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

คำตอบ:


181

คุณสามารถใช้TIMEDIFF()และTIME_TO_SEC()ฟังก์ชั่นดังต่อไปนี้:

SELECT TIME_TO_SEC(TIMEDIFF('2010-08-20 12:01:00', '2010-08-20 12:00:00')) diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

คุณยังสามารถใช้UNIX_TIMESTAMP()ฟังก์ชันตามที่@Amber แนะนำในคำตอบอื่น ๆ :

SELECT UNIX_TIMESTAMP('2010-08-20 12:01:00') - 
       UNIX_TIMESTAMP('2010-08-20 12:00:00') diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

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

เมื่อUNIX_TIMESTAMP()ใช้กับTIMESTAMPคอลัมน์ฟังก์ชันจะส่งคืนค่าการประทับเวลาภายในโดยตรงโดยไม่มีการแปลง "string-to-Unix-timestamp" โดยนัย

โปรดทราบว่าTIMEDIFF() ส่งคืนข้อมูลประเภทTIME . TIMEค่าอาจอยู่ในช่วง "-838: 59: 59" ถึง "838: 59: 59" (ประมาณ 34.96 วัน)


13
นอกจากนี้คุณยังสามารถใช้TIMESTAMPDIFFซึ่งไม่ได้ในฟังก์ชันเดียว - เพียงแค่ตั้งค่าพารามิเตอร์unit SECOND
Mike

+1 สำหรับคำอธิบายประสิทธิภาพ ฉันไม่ได้ใช้ UNIX_TIMESTAMP () เพราะคิดว่าต้องใช้เวลามากกว่านี้
elcool

57

เกี่ยวกับ "TIMESTAMPDIFF":

SELECT TIMESTAMPDIFF(SECOND,'2009-05-18','2009-07-29') from `post_statistics`

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff


หากคอลัมน์วันที่ของคุณอยู่ในรูปแบบอื่นที่ปปปปป - ดด - ววลองทำสิ่งนี้: str_to_date(date_column, '%m/%d/%Y')ภายในฟังก์ชัน TIMESTAMPDIFF สำหรับคอลัมน์ที่ต้องการให้มีการจัดรูปแบบแก้ไข
greaterKing

นี่เป็นคำตอบที่ดีกว่าสำหรับฉันเนื่องจากมีค่าสูงสุดTIME_TO_SECใน3020399ขณะที่สิ่งนี้ส่งกลับค่าที่ถูกต้อง
billynoah

21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

ถ้าคุณต้องการความแตกต่างที่ไม่ได้ลงนามให้เพิ่มABS()รอบนิพจน์

หรือคุณสามารถใช้แล้วแปลงผลเวลาที่จะวินาทีกับTIMEDIFF(ts1, ts2)TIME_TO_SEC()


13

โปรดทราบว่าTIMEDIFF()การแก้ปัญหาจะทำงานเฉพาะเมื่อdatetimesมีน้อยกว่า 35 วันออกจากกัน! TIMEDIFF()ส่งคืนTIMEประเภทข้อมูลและค่าสูงสุดสำหรับ TIME คือ 838: 59: 59 ชั่วโมง (= 34,96 วัน)

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