MySQL: cara mendapatkan perbedaan antara dua cap waktu dalam hitungan detik


100

Apakah ada cara saya bisa membuat kueri di MySQL yang akan memberi saya perbedaan antara dua cap waktu dalam hitungan detik, atau apakah saya perlu melakukannya di PHP? Dan jika demikian, bagaimana saya akan melakukan itu?

Jawaban:


177

Anda dapat menggunakan TIMEDIFF()dan TIME_TO_SEC()fungsi sebagai berikut:

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)

Anda juga dapat menggunakan UNIX_TIMESTAMP()fungsi seperti yang disarankan @Amber dalam jawaban lain:

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)

Jika Anda menggunakan TIMESTAMPtipe data, saya kira UNIX_TIMESTAMP()solusinya akan sedikit lebih cepat, karena TIMESTAMPnilai sudah disimpan sebagai bilangan bulat yang mewakili jumlah detik sejak zaman ( Sumber ). Mengutip dokumen :

Saat UNIX_TIMESTAMP()digunakan pada TIMESTAMPkolom, fungsi tersebut mengembalikan nilai stempel waktu internal secara langsung, tanpa konversi implisit "string-to-Unix-timestamp".

Perlu diingat bahwa TIMEDIFF() tipe data pengembalianTIME . TIMEnilai dapat berkisar dari '-838: 59: 59' hingga '838: 59: 59' (kira-kira 34.96 hari)


11
Anda juga dapat menggunakan TIMESTAMPDIFF , yang melakukannya dalam satu fungsi - cukup setel unitparameternya ke SECOND.
Mike

1 untuk penjelasan kinerja. Saya tidak menggunakan UNIX_TIMESTAMP () karena menurut saya akan memakan waktu lebih lama.
elcool

52

Bagaimana dengan "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


Jika kolom tanggal Anda dalam bentuk lain selain YYYY-MM-DD coba lakukan ini: str_to_date(date_column, '%m/%d/%Y')dalam fungsi TIMESTAMPDIFF untuk kolom yang perlu dikoreksi formatnya.
GreaterKing

ini adalah jawaban yang lebih baik bagi saya karena TIME_TO_SECmaxes out 3020399sedangkan ini mengembalikan nilai yang benar.
billynoah

21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

Jika Anda menginginkan perbedaan yang tidak ditandai, tambahkan di ABS()sekitar ekspresi.

Alternatifnya, Anda dapat menggunakan TIMEDIFF(ts1, ts2)dan kemudian mengubah hasil waktu menjadi detik dengan TIME_TO_SEC().


11

Perhatikan bahwa TIMEDIFF()solusi hanya bekerja ketika datetimesyang kurang dari 35 hari terpisah! TIMEDIFF()mengembalikan TIMEtipe data, dan nilai maksimum untuk TIME adalah 838: 59: 59 jam (= 34,96 hari)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.