2010-03-30 3 views
41

Wie kann ich den Unterschied zwischen zwei Zeitstempeln in Tagen ermitteln? Sollte ich dafür eine Datetime-Spalte verwenden? MySql Unterschied zwischen zwei Zeitstempeln in Tagen?


Ich wechselte meine Spalte zu datetime. Einfache Subtraktion scheint mir in Tagen kein Ergebnis zu geben.

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) 

Ich glaube nicht, diff ist in Sekunden, denn wenn ich diff nach Anzahl der Sekunden in einem Tag (86.400) teilen, ich habe keine unsinnige Antwort erhalten:

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

Welcher Datentyp sind Ihre Spalten/Werte im Moment? –

+0

Ich habe Zeitstempel verwendet, aber ich habe gerade eine Spalte in datetime geändert. – user151841

Antwort

92

Wenn Sie den Zeitabschnitt in den Spalten ignorieren möchten, gibt Ihnen DATEDIFF() den Unterschied, nach dem Sie in Tagen suchen.

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

Ich habe auch gegoogelt, wie man den Unterschied zwischen dem aktuellen Datum findet, also lass es hier sein: '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

ich weiß, ist ziemlich alt, aber ich werde nur um es zu sagen - ich war für das gleiche Problem suchen und bekam hier, aber ich brauchte den Unterschied in Tagen.

Ich verwendete SELECT (UNIX_TIMESTAMP(DATE1) - UNIX_TIMESTAMP(DATE2))/60/60/24 Unix_timestamp gibt die Differenz in Sekunden, und dann teile ich nur in Minuten (Sekunden/60), Stunden (Minuten/60), Tage (Stunden/24).

+0

Geht das richtig mit Schaltjahren um? – user151841

+1

Ja, weil der Zeitstempel die Schaltjahre behandelt. Die Zeitstempeldifferenz gibt die Differenz zwischen zwei Daten in Sekunden zurück. Wenn Sie bis zum Tag teilen, geht es Ihnen gut (jeder einzelne Tag jedes Jahr hat die gleiche Anzahl von Sekunden). – Enrico

+1

@ Enrico - Nicht wahr. Einige Tage haben je nach Jahr eine zusätzliche Sekunde oder zwei Sekunden. Diese finden entweder am 30. Juni Mitternacht oder am 31. Dezember Mitternacht statt.Sie sind Schaltsekunden, die sich auf die Drift zwischen mittleren Sonnentagsekunden und der Atomuhrsekunde einstellen. Wenn Sie die UNIX- und SQL-Rechner überprüfen, werden sie eine 62-Sekunden-Minute erlauben, was bedeutet, dass Sekundenwerte von 0 bis einschließlich 61 reichen können. Die Anpassung kann auch um zwei Sekunden negativ sein, aber das ist noch nie vorgekommen, da die Drift immer positive Schaltsekunden benötigt. Der Standard erlaubt bis zu 2 Sekunden. – Jim

3

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

hier datediff zwei Argumente 'up-to-date' erfolgt, 'from-date'

Was ich getan habe, jetzt mit() Funktion, ich kann nicht bekommen. von Tagen seit dem 20. Juni 2013 bis heute.

5

Wenn Sie in voller Zeitformat zurückkehren wollen, als es versuchen: -

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

Rückkehr wie

 diff 
    - - - 
    00:05:15 
3

Wenn Sie den Unterschied in Tagen Buchhaltung bis zum zweiten müssen:

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

wird 16.8629 Tage zurückgeben.

0

SELECT DATEDIFF (max_date, min_date) als Tage von meiner Tabelle. Dies funktioniert auch, wenn die Spalte max_date und min_date in Zeichenfolgendatentypen sind.