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?

The.Anti.9
sumber

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)

Daniel Vassallo
sumber
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

David
sumber
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().

Amber
sumber
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)

Rekayasa Tenaga
sumber