MySQL: cách nhận được sự khác biệt giữa hai dấu thời gian trong vài giây


97

Có cách nào tôi có thể thực hiện một truy vấn trong MySQL sẽ cung cấp cho tôi sự khác biệt giữa hai dấu thời gian trong vài giây hay tôi cần thực hiện điều đó trong PHP? Và nếu vậy, tôi sẽ làm như thế nào?

Câu trả lời:


176

Bạn có thể sử dụng TIMEDIFF()và các TIME_TO_SEC()chức năng như sau:

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)

Bạn cũng có thể sử dụng UNIX_TIMESTAMP()hàm như @Amber đã đề xuất trong một câu trả lời khác:

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)

Nếu bạn đang sử dụng TIMESTAMPkiểu dữ liệu, tôi đoán rằng UNIX_TIMESTAMP()giải pháp sẽ nhanh hơn một chút, vì TIMESTAMPcác giá trị đã được lưu trữ dưới dạng số nguyên đại diện cho số giây kể từ kỷ nguyên ( Nguồn ). Trích dẫn tài liệu :

Khi UNIX_TIMESTAMP()được sử dụng trên một TIMESTAMPcột, hàm trả về giá trị dấu thời gian bên trong trực tiếp, không có chuyển đổi ngầm định "chuỗi-sang-Unix-dấu thời gian".

Hãy nhớ rằng TIMEDIFF() kiểu dữ liệu trả về làTIME . TIMEgiá trị có thể nằm trong khoảng từ '-838: 59: 59' đến '838: 59: 59' (khoảng 34,96 ngày)


11
Bạn cũng có thể sử dụng TIMESTAMPDIFF , thực hiện nó trong một hàm duy nhất - chỉ cần đặt unittham số thành SECOND.
Mike

+1 cho phần giải thích về hiệu suất. Tôi đã không sử dụng UNIX_TIMESTAMP () vì tôi nghĩ sẽ mất nhiều thời gian hơn.
elcool

51

Còn về "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# Chức năng_timestampdiff


Nếu cột ngày của bạn ở dạng khác YYYY-MM-DD, hãy thử thực hiện điều này: str_to_date(date_column, '%m/%d/%Y')trong hàm TIMESTAMPDIFF cho cột cần sửa định dạng.
hơnKing

đây là một câu trả lời tốt hơn cho tôi vì giá trị TIME_TO_SECtối đa ở mức tối đa 3020399trong khi điều này trả về giá trị chính xác.
billynoah

21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

Nếu bạn muốn có một sự khác biệt không dấu, hãy thêm một ABS()xung quanh biểu thức.

Ngoài ra, bạn có thể sử dụng TIMEDIFF(ts1, ts2)và sau đó chuyển đổi kết quả thời gian thành giây với TIME_TO_SEC().


11

Lưu ý rằng TIMEDIFF()giải pháp chỉ hoạt động khi cách datetimesnhau ít hơn 35 ngày ! TIMEDIFF()trả về một TIMEkiểu dữ liệu và giá trị tối đa cho TIME là 838: 59: 59 giờ (= 34,96 ngày)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.