Differenza tra due date in MySQL


173

Come calcolare la differenza tra due date, nel formato YYYY-MM-DD hh: mm: sse per ottenere il risultato in secondi o millisecondi?


14
@didxga: Attenzione: (end - start) NON restituisce una differenza di secondi tra i valori di datetime. Restituisce un numero che è la differenza tra numeri decimali che sembrano yyyymmddhhmmss.
ciaoPiers,

Risposte:


329
SELECT TIMEDIFF('2007-12-31 10:02:00','2007-12-30 12:01:01');
-- result: 22:00:59, the difference in HH:MM:SS format


SELECT TIMESTAMPDIFF(SECOND,'2007-12-30 12:01:01','2007-12-31 10:02:00'); 
-- result: 79259  the difference in seconds

Quindi, puoi usare TIMESTAMPDIFFper il tuo scopo.


2
Che cosa significa esattamente "la differenza in secondi per giorni"? Non capisco perché moltiplicare il risultato di TIMEDIFFper 24*60*60non sia uguale al risultato di TIMESTAMPDIFF.
David Tuite,

Questa soluzione ha funzionato per me! Ma nel mio caso, mi piacerebbe eseguire il TIMESTAMPDIFF in DAY, ma non considerando i fine settimana (sabato / sole). Voglio dire, solo la differenza di giorni della settimana ... È possibile in modo semplice? In caso contrario, chiedo scusa per l'inconveniente, quindi cercherò un'altra soluzione. TK.
Massa,

8
TIMEDIFF nell'esempio non è corretto in quanto non è il numero di secondi tra questi due giorni. TIMEDIFF restituisce un valore TIME, che ha ore, minuti e secondi della differenza. Moltiplicandolo non si otterrà una risposta utile. Usa TIMESTAMPDIFF.
IvanD

4
Interessante che si TIMEDIFF()aspetta che gli argomenti dell'ora di inizio e di fine siano nell'ordine opposto di quanto ci si aspetti TIMESTAMPDIFF().
LS

1
Nota: quando si utilizza la funzione TIMEDIFF, il valore del tempo può variare da "-838: 59: 59" a "838: 59: 59". w3schools.com/SQl/func_mysql_timediff.asp
cREcker


29

Ottieni la differenza di data in giorni usando DATEDIFF

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

O

Fare riferimento al seguente link differenza MySql tra due timestamp in giorni?


caro, è perfetto per la domanda sopra, ma voglio alcune modifiche con la stessa query, quindi per favore mi aiuti che come può essere raggiunto. qui voglio confrontare il risultato finale con il mio valore, come SELECT * FROM table where datediff(today,databasedate) as days =3;qualcosa del genere
Sooraj Abbasi,

9
SELECT TIMESTAMPDIFF(HOUR,NOW(),'2013-05-15 10:23:23')
   calculates difference in hour.(for days--> you have to define day replacing hour
SELECT DATEDIFF('2012-2-2','2012-2-1')

SELECT TO_DAYS ('2012-2-2')-TO_DAYS('2012-2-1')

4
select 
unix_timestamp('2007-12-30 00:00:00') - 
unix_timestamp('2007-11-30 00:00:00');

3
unix_timestamp - un modo standard di temporizzazione nei sistemi simili a Unix. Rappresenta un numero intero a 32 bit, che indica quanti secondi sono trascorsi dall'01 / 01/1970 alle 00:00:00. Cioè un limite inferiore. Il limite superiore è limitato a 2.106 all'anno, ma a causa di programmi frequenti che non funzionano con questo valore (invece di un numero intero senza segno che utilizza un numero intero con segno) è considerato il limite superiore nel 2038.
Devid G

+ quando si passa attraverso l'ora legale viene erroneamente dedotto / aggiunto
Devid G

1
SELECT TIMESTAMPDIFF(SECOND,'2018-01-19 14:17:15','2018-01-20 14:17:15');

Secondo approccio

SELECT ( DATEDIFF('1993-02-20','1993-02-19')*( 24*60*60) )AS 'seccond';

CURRENT_TIME() --this will return current Date
DATEDIFF('','') --this function will return  DAYS and in 1 day there are 24hh 60mm 60sec

0

In alternativa, è possibile utilizzare la funzione TIMEDIFF

mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');
'-00:00:00.000001'
mysql> SELECT TIMEDIFF('2008-12-31 23:59:59.000001' , '2008-12-30 01:01:01.000002');
 '46:58:57.999999'

TC vuole ottenere il valore dei risultati in secondi o millisecondi.
Devid G,

0

Questa funzione prende la differenza tra due date e la mostra in un formato data aaaa-mm-gg. Tutto ciò che serve è eseguire il codice seguente e quindi utilizzare la funzione. Dopo l'esecuzione puoi usarlo in questo modo

SELECT datedifference(date1, date2)
FROM ....
.
.
.
.


DELIMITER $$

CREATE FUNCTION datedifference(date1 DATE, date2 DATE) RETURNS DATE
NO SQL

BEGIN
    DECLARE dif DATE;
    IF DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2)))) < 0    THEN
                SET dif=DATE_FORMAT(
                                        CONCAT(
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                            '-',
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                            '-',
                                            DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(DATE_SUB(date1, INTERVAL 1 MONTH)), '-', DAY(date2))))),
                                        '%Y-%m-%d');
    ELSEIF DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2)))) < DAY(LAST_DAY(DATE_SUB(date1, INTERVAL 1 MONTH))) THEN
                SET dif=DATE_FORMAT(
                                        CONCAT(
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                            '-',
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                            '-',
                                            DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2))))),
                                        '%Y-%m-%d');
    ELSE
                SET dif=DATE_FORMAT(
                                        CONCAT(
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                            '-',
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                            '-',
                                            DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2))))),
                                        '%Y-%m-%d');
    END IF;

RETURN dif;
END $$
DELIMITER;

0
select TO_CHAR(TRUNC(SYSDATE)+(to_date( '31-MAY-2012 12:25', 'DD-MON-YYYY HH24:MI') 
                             - to_date( '31-MAY-2012 10:37', 'DD-MON-YYYY HH24:MI')), 
        'HH24:MI:SS') from dual

- risultato: 01:48:00

OK non è proprio quello che l'OP ha chiesto, ma è quello che volevo fare :-)


0

Questo codice calcola la differenza tra due date nel formato aaaaa MM gg.

declare @StartDate datetime 
declare @EndDate datetime

declare @years int
declare @months int 
declare @days int

--NOTE: date of birth must be smaller than As on date, 
--else it could produce wrong results
set @StartDate = '2013-12-30' --birthdate
set @EndDate  = Getdate()            --current datetime

--calculate years
select @years = datediff(year,@StartDate,@EndDate)

--calculate months if it's value is negative then it 
--indicates after __ months; __ years will be complete
--To resolve this, we have taken a flag @MonthOverflow...
declare @monthOverflow int
select @monthOverflow = case when datediff(month,@StartDate,@EndDate) - 
  ( datediff(year,@StartDate,@EndDate) * 12) <0 then -1 else 1 end
--decrease year by 1 if months are Overflowed
select @Years = case when @monthOverflow < 0 then @years-1 else @years end
select @months =  datediff(month,@StartDate,@EndDate) - (@years * 12) 

--as we do for month overflow criteria for days and hours 
--& minutes logic will followed same way
declare @LastdayOfMonth int
select @LastdayOfMonth =  datepart(d,DATEADD
    (s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate)+1,0)))

select @days = case when @monthOverflow<0 and 
    DAY(@StartDate)> DAY(@EndDate) 
then @LastdayOfMonth + 
  (datepart(d,@EndDate) - datepart(d,@StartDate) ) - 1  
      else datepart(d,@EndDate) - datepart(d,@StartDate) end 


select
 @Months=case when @days < 0 or DAY(@StartDate)> DAY(@EndDate) then @Months-1 else @Months end

Declare @lastdayAsOnDate int;
set @lastdayAsOnDate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate),0)));
Declare @lastdayBirthdate int;
set @lastdayBirthdate =  datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@StartDate)+1,0)));

if (@Days < 0) 
(
    select @Days = case when( @lastdayBirthdate > @lastdayAsOnDate) then
        @lastdayBirthdate + @Days
    else
        @lastdayAsOnDate + @Days
    end
)
print  convert(varchar,@years)   + ' year(s),   '  +
       convert(varchar,@months)  + ' month(s),   ' +
       convert(varchar,@days)    + ' day(s)   '   

Perché non usare semplicemente la TIMESTAMPDIFFfunzione?
codeforester

0

Se hai una data memorizzata nel campo di testo come stringa, puoi implementare questo codice che recupererà l'elenco del numero passato di giorni a settimana, un mese o un anno di ordinamento:

SELECT * FROM `table` WHERE STR_TO_DATE(mydate, '%d/%m/%Y') < CURDATE() - INTERVAL 30 DAY AND STR_TO_DATE(date, '%d/%m/%Y') > CURDATE() - INTERVAL 60 DAY

//This is for a month

SELECT * FROM `table` WHERE STR_TO_DATE(mydate, '%d/%m/%Y') < CURDATE() - INTERVAL 7 DAY AND STR_TO_DATE(date, '%d/%m/%Y') > CURDATE() - INTERVAL 14 DAY

//This is for a week 

% d% m% Y è il formato della data

Questa query mostra il record tra i giorni impostati lì come: Sotto degli ultimi 7 giorni e Sopra negli ultimi 14 giorni, quindi sarebbe il tuo record dell'ultima settimana per visualizzare lo stesso concetto è per mese o anno. Qualunque sia il valore che stai fornendo in date come: in basso da 7 giorni, quindi l'altro valore sarebbe il doppio di 14 giorni. Quello che stiamo dicendo qui ottiene tutti i record sopra dagli ultimi 14 giorni e sotto dagli ultimi 7 giorni. Questo è un record settimanale che puoi modificare il valore in 30-60 giorni per un mese e anche per un anno.

Grazie Spero che possa aiutare qualcuno.


-1

Lo faresti semplicemente:

SELECT (end_time - start_time) FROM t; -- return in Millisecond
SELECT (end_time - start_time)/1000 FROM t; -- return in Second

5
Attenzione: (end - start) NON restituisce una differenza di secondi tra i valori datetime. Restituisce un numero che è la differenza tra numeri decimali che sembrano yyyymmddhhmmss.
ciaoPiers,

-1

Perché non solo

Seleziona Somma (Data1 - Data2) dalla tabella

data1 e data2 sono datetime


Questo non restituisce la differenza di data in secondi, ma restituisce la differenza tra numeri decimali che sembrano yyyymmddhhmmss. Quindi, questo non risolve la domanda di OP. La stessa cosa è menzionata anche nel commento sulla domanda.
codeforester
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.