2010-03-30 29 views
41

Come posso ottenere la differenza tra due timestamp in giorni? Dovrei usare una colonna datetime per questo? MySql differenza tra due timestamp in giorni?


Ho cambiato la colonna in data/ora. La semplice sottrazione non sembra darmi un risultato in giorni.

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) 

Non credo diff è espresso in secondi, perché quando divido diff per numero di secondi in un giorno (86.400), non ottengo una risposta 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

Quali tipi di dati sono le tue colonne/valori al momento? –

+0

Stavo usando i timestamp, ma ho appena cambiato una colonna in datetime. – user151841

risposta

92

Se sei felice di ignorare la porzione di tempo nelle colonne, DATEDIFF() ti darà la differenza che stai cercando in giorni.

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

Stavo anche cercando su google come trovare la differenza tra la data corrente, quindi lascia che sia qui: '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

quello che so è abbastanza vecchio, ma lo dirò solo per il gusto di farlo - che stavo cercando lo stesso problema e arrivato qui, ma avevo bisogno la differenza di giorni.

ho usato SELECT (UNIX_TIMESTAMP(DATE1) - UNIX_TIMESTAMP(DATE2))/60/60/24 UNIX_TIMESTAMP restituisce la differenza in pochi secondi, e poi mi basta dividere in minuti (secondi/60), ore (minuti/60), giorni (ore/24).

+0

Gestisce correttamente gli anni bisestili? – user151841

+1

Sì, perché il timestamp gestisce gli anni bisestili. La differenza timestamp restituisce la differenza tra due date in secondi. Se dividi fino al giorno, stai bene (ogni singolo giorno ogni anno ha la stessa quantità di secondi). – Enrico

+1

@Enrico - Non vero. Alcuni giorni hanno un secondo o due secondi in più a seconda dell'anno. Questi si verificano a mezzanotte del 30 giugno o mezzanotte del 31 dicembre.Sono i secondi bisestili che si adattano alla deriva tra i secondi del giorno solare medio e il secondo dell'orologio atomico. Se si controllano i calcolatori UNIX e SQL, essi consentiranno un minuto di 62 secondi, il che significa che i valori dei secondi possono variare da 0 a 61 inclusi. Anche la regolazione può essere negativa di due secondi, ma ciò non si è mai verificato poiché la deriva è sempre verso il bisogno di secondi bisestili positivi. Lo standard consente fino a 2 secondi. – Jim

3

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

qui datediff prende due argomenti 'fino a-data', 'dal-date'

Quello che ho fatto è, usando ora function(), posso ottenere no. di giorni dal 20 giugno 2013 fino ad oggi.

5

Se si desidera tornare a pieno formato TIMESTAMP di provare: -

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

ritorno come

 diff 
    - - - 
    00:05:15 
3

Se avete bisogno della differenza in giorni contabilità fino al secondo:

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

restituirà 16.8629 giorni.

0

SELEZIONARE DATEDIFF (max_date, min_date) come giorni dalla mia tabella. Funziona anche se il col max_date e min_date sono in tipi di dati stringa.

Problemi correlati