MySQL: iki zaman damgası arasındaki fark saniyeler içinde nasıl elde edilir


101

MySQL'de iki zaman damgası arasındaki farkı saniyeler içinde verecek bir sorgu yapabilmemin bir yolu var mı, yoksa bunu PHP'de yapmam gerekir mi? Ve eğer öyleyse, bunu nasıl yapacağım?

Yanıtlar:


178

TIMEDIFF()Ve TIME_TO_SEC()işlevlerini aşağıdaki gibi kullanabilirsiniz :

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()İşlevi @Amber'ın başka bir yanıtta önerdiği şekilde de kullanabilirsiniz :

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)

TIMESTAMPVeri türünü kullanıyorsanız, değerlerin çağdan ( Kaynak ) bu yana geçen saniye sayısını temsil eden bir tamsayı olarak zaten depolandığı için UNIX_TIMESTAMP()çözümün biraz daha hızlı olacağını tahmin ediyorum . Dokümanlardan alıntı yapmak :TIMESTAMP

Bir sütunda UNIX_TIMESTAMP()kullanıldığında TIMESTAMP, işlev, örtük bir “dizeden Unix'e-zaman damgası” dönüşümü olmaksızın dahili zaman damgası değerini doğrudan döndürür.

Döndürülen TIMEDIFF() veri türünüTIME unutmayın . TIMEdeğerler "-838: 59: 59" ile "838: 59: 59" arasında değişebilir (kabaca 34,96 gün)


13
Ayrıca bunu tek bir işlevde yapan TIMESTAMPDIFF'i de kullanabilirsiniz - sadece unitparametreyi olarak ayarlayın SECOND.
Mike

Performans açıklaması için +1. Daha fazla zaman alacağını düşündüğüm için UNIX_TIMESTAMP () kullanmıyordum.
elcool

55

Peki ya "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


Tarih sütununuz YYYY-AA-GG dışında başka bir biçimdeyse şunu yapmayı deneyin: str_to_date(date_column, '%m/%d/%Y')biçimlendirmesinin düzeltilmesi gereken sütun için TIMESTAMPDIFF işlevi içinde.
greatKing

bu benim için daha iyi bir cevap çünkü TIME_TO_SECmaxes at, 3020399oysa bu doğru değeri döndürüyor.
billynoah

21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

İmzasız bir fark istiyorsanız ABS(), ifadenin çevresine bir ekleyin .

Alternatif olarak, TIMEDIFF(ts1, ts2)ile zaman sonucunu kullanabilir ve ardından saniyeye dönüştürebilirsiniz TIME_TO_SEC().


11

Not TIMEDIFF()zaman çözüm çalışır datetimesolan az 35 gün arayla! TIMEDIFF()bir TIMEveri türü döndürür ve TIME için maksimum değer 838: 59: 59 saattir (= 34,96 gün)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.