2010-03-30 12 views
41

Jak mogę uzyskać różnicę między dwoma znacznikami czasu w dniach? Czy powinienem używać do tego kolumny datetime? MySql różnica między dwoma znacznikami czasu w dniach?


Zmieniłem kolumnę na datetime. Proste odejmowanie nie wydaje mi się rezultatem w ciągu kilku dni.

mysql> SELECT NOW(), last_confirmation_attempt, NOW() - last_confirmation_attempt AS diff FROM DateClubs HAVING diff IS NOT NULL ; 
+---------------------+---------------------------+-----------------+ 
| NOW()    | last_confirmation_attempt | diff   | 
+---------------------+---------------------------+-----------------+ 
| 2010-03-30 10:52:31 | 2010-03-16 10:41:47  | 14001084.000000 | 
+---------------------+---------------------------+-----------------+ 
1 row in set (0.00 sec) 

Nie sądzę diff jest w sekundach, bo kiedy podzielić diff przez liczbę sekund w ciągu dnia (86,400), nie dostanę odpowiedzi sensical:

mysql> SELECT NOW(), last_confirmation_attempt, (NOW() - last_confirmation_attempt)/86400 AS diff FROM DateClubs HAVING diff IS NOT NULL ; 
+---------------------+---------------------------+----------------+ 
| NOW()    | last_confirmation_attempt | diff   | 
+---------------------+---------------------------+----------------+ 
| 2010-03-30 10:58:58 | 2010-03-16 10:41:47  | 162.0568402778 | 
+---------------------+---------------------------+----------------+ 
1 row in set (0.00 sec) 
+0

Jakimi typami danych są obecnie twoje kolumny/wartości? –

+0

Używałem znaczników czasu, ale właśnie zmieniłem jedną kolumnę na datetime. – user151841

Odpowiedz

92

Jeśli z przyjemnością zignorujesz część czasu w kolumnach, DATEDIFF() da ci różnicę, której szukasz w ciągu kilku dni.

SELECT DATEDIFF('2010-10-08 18:23:13', '2010-09-21 21:40:36') AS days; 
+------+ 
| days | 
+------+ 
| 17 | 
+------+ 
+5

Ja również szukałem informacji o tym, jak znaleźć różnicę między bieżącą datą, więc niech będzie tutaj: 'DATEDIFF (CURDATE(), '2015-04-18')'. – ivkremer

4
CREATE TABLE t (d1 timestamp, d2 timestamp); 

INSERT INTO t VALUES ('2010-03-11 12:00:00', '2010-03-30 05:00:00'); 
INSERT INTO t VALUES ('2010-03-11 12:00:00', '2010-03-30 13:00:00'); 
INSERT INTO t VALUES ('2010-03-11 00:00:00', '2010-03-30 13:00:00'); 
INSERT INTO t VALUES ('2010-03-10 12:00:00', '2010-03-30 13:00:00'); 
INSERT INTO t VALUES ('2010-03-10 12:00:00', '2010-04-01 13:00:00'); 

SELECT d2, d1, DATEDIFF(d2, d1) AS diff FROM t; 

+---------------------+---------------------+------+ 
| d2     | d1     | diff | 
+---------------------+---------------------+------+ 
| 2010-03-30 05:00:00 | 2010-03-11 12:00:00 | 19 | 
| 2010-03-30 13:00:00 | 2010-03-11 12:00:00 | 19 | 
| 2010-03-30 13:00:00 | 2010-03-11 00:00:00 | 19 | 
| 2010-03-30 13:00:00 | 2010-03-10 12:00:00 | 20 | 
| 2010-04-01 13:00:00 | 2010-03-10 12:00:00 | 22 | 
+---------------------+---------------------+------+ 
5 rows in set (0.00 sec) 
11

wiem jest dość stary, ale powiem tylko przez wzgląd na to - Szukałem tego samego problemu, a tu mamy, ale potrzebowałem różnicę dni.

Użyłem SELECT (UNIX_TIMESTAMP(DATE1) - UNIX_TIMESTAMP(DATE2))/60/60/24 Unix_timestamp zwraca różnicę w sekundach, a następnie po prostu dzielę na minuty (sekundy/60), godziny (minuty/60), dni (godziny/24).

+0

Czy prawidłowo obsługuje lata przestępne? – user151841

+1

Tak, ponieważ znacznik czasu obsługuje lata przestępne. Różnica znacznika czasu zwraca różnicę między dwiema datami w sekundach. Jeśli podzielisz dzień, wszystko będzie dobrze (każdy dzień każdego roku ma taką samą ilość sekund). – Enrico

+1

@Enrico - Nieprawda. Niektóre dni mają dodatkową sekundę lub dwie sekundy w zależności od roku. Występują one albo o północy 30 czerwca, albo o północy 31 grudnia.Są to sekundy przestępne, które dostosowują się do dryfu między średnią liczbą dni słonecznych a sekundowym zegarem atomowym. Jeśli zaznaczysz kalkulatory UNIX i SQL, pozwolą one na 62 sekundową minutę, co oznacza, że ​​wartości sekund mogą być w zakresie od 0 do 61 włącznie. Ustawienie może być również ujemne o dwie sekundy, ale nigdy nie miało to miejsca, ponieważ dryf jest zawsze potrzebny do uzyskania dodatnich sekund przestępnych. Standard pozwala na maksymalnie 2 sekundy. – Jim

3

SELECT DATEDIFF(now(), '2013-06-20');

tutaj DateDiff przyjmuje dwa argumenty 'upto-date', 'z aktualnych'

co zrobiłem jest, teraz za pomocą funkcji(), nie mogę dostać. dni od 20 czerwca do końca 2013 r.

5

Jeśli chcesz wrócić w pełnym formacie timestamp niż próbować go: -

SELECT TIMEDIFF(`call_end_time`, `call_start_time`) as diff from tablename; 

powrót jak

 diff 
    - - - 
    00:05:15 
3

Jeśli potrzebujesz różnicę w dniach rozliczania się do drugiego:

SELECT TIMESTAMPDIFF (SECOND, '2010-09-21 21:40:36', '2010-10-08 18:23:13')/86400 AS diff

spowoduje zwrócenie 16.8629 dni.

0

SELECT DATEDIFF (max_date, min_date) jako dni z mojego stołu. Działa to, nawet jeśli col max_date i min_date są w typach danych łańcuchowych.

Powiązane problemy