Diferença entre duas datas no MySQL

173

Como calcular a diferença entre duas datas, no formato YYYY-MM-DD hh: mm: sse obter o resultado em segundos ou milissegundos?

GeoGo
fonte
14
@didxga: Cuidado: (fim - início) NÃO retorna uma diferença de segundos entre os valores de data e hora. Retorna um número que é a diferença entre números decimais que se parecem com aaaammddhhmmss.
precisa saber é o seguinte

Respostas:

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

Então, você pode usar TIMESTAMPDIFFpara o seu propósito.

Devid G
fonte
2
O que significa "a diferença em segundos por dias" exatamente? Não entendo por que multiplicar o resultado de TIMEDIFFpor 24*60*60não é igual ao resultado de TIMESTAMPDIFF.
David Tuite 22/10/2013
Esta solução funcionou para mim! Mas no meu caso, eu gostaria de executar o TIMESTAMPDIFF em DAY, mas sem considerar os fins de semana (sáb / dom). Quero dizer, apenas dias de semana de diferença ... É possível de uma maneira simples? Caso contrário, peço desculpas pelo inconveniente e procurarei outra solução. TKs.
Massa
8
TIMEDIFF no exemplo está incorreto, pois esse não é o número de segundos entre esses dois dias. TIMEDIFF retorna um valor TIME, que possui horas, minutos e segundos da diferença. Multiplicá-lo não produzirá uma resposta útil. Use TIMESTAMPDIFF.
IvanD
4
Interessante que TIMEDIFF()espera que os argumentos de hora inicial e final estejam na ordem oposta à esperada por TIMESTAMPDIFF().
LS
1
Nota: Ao usar a função TIMEDIFF, o valor do tempo pode variar de "-838: 59: 59" a "838: 59: 59". w3schools.com/SQl/func_mysql_timediff.asp
cREcker
38

Se você estiver trabalhando com colunas DATE (ou pode convertê-las como colunas de data), tente DATEDIFF () e multiplique por 24 horas, 60 minutos e 60 segundos (já que DATEDIFF retorna a diferença em dias). No MySQL:

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

por exemplo:

mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30 00:00:00') * 24*60*60
kvista
fonte
5
Eu não acho que isso funcione. DATEDIFFnão retorna frações.
Juan Carlos Oropeza
29

Obter a diferença de data em dias usando DATEDIFF

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

OU

Consulte a diferença MySql no link abaixo entre dois registros de data e hora em dias?

Kailas
fonte
querido, é perfeito para a pergunta acima, mas eu quero algumas modificações com a mesma consulta, por favor poderia me ajudar que como pode é conseguir isso. aqui eu quero comparar o resultado final com o meu valor, SELECT * FROM table where datediff(today,databasedate) as days =3;algo como isto
Sooraj Abbasi 16/06
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')
Romancha KC
fonte
4
select 
unix_timestamp('2007-12-30 00:00:00') - 
unix_timestamp('2007-11-30 00:00:00');
ajreal
fonte
3
unix_timestamp - uma maneira padrão de temporização nos sistemas do tipo Unix. Representa um número inteiro de 32 bits, indicando quantos segundos se passaram desde 01/01/1970 00:00:00. Ou seja, um limite inferior. O limite superior é limitado a 2.106 por ano, mas, devido a programas freqüentes, não opera com esse valor (em vez de um número inteiro não assinado usando um número inteiro assinado) é considerado o limite superior em 2038.
Devid G
+ quando a passagem no horário de verão é deduzida / adicionada incorretamente #
Devid G
1
SELECT TIMESTAMPDIFF(SECOND,'2018-01-19 14:17:15','2018-01-20 14:17:15');

Segunda abordagem

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
abdul rehman kk
fonte
0

Ou você pode usar a função 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'
Anton Sizikov
fonte
O TC deseja obter o valor dos resultados em segundos ou milissegundos.
precisa saber é o seguinte
0

Essa função pega a diferença entre duas datas e a mostra em um formato de data aaaa-mm-dd. Tudo o que você precisa é executar o código abaixo e usar a função Após a execução, você pode usá-lo assim

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;
enor
fonte
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

- resultado: 01:48:00

OK, não é bem o que o OP pediu, mas é o que eu queria fazer :-)

Cara
fonte
0

Esse código calcula a diferença entre duas datas no formato dd MM / aaaa.

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)   '   
Mohan Kumar
fonte
Por que não simplesmente usar a TIMESTAMPDIFFfunção?
codeforester 29/03
0

Se você tiver uma data armazenada no campo de texto como sequência, poderá implementar esse código, ele buscará a lista dos últimos dias da semana, um mês ou um ano:

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 é o seu formato de data

Esta consulta exibe o registro entre os dias que você definiu lá: Abaixo dos últimos 7 dias e Acima dos últimos 14 dias, portanto, seria o seu registro da última semana exibir o mesmo conceito para mês ou ano. Qualquer que seja o valor que você esteja fornecendo na data abaixo, como: abaixo de 7 dias, o outro valor seria o dobro de 14 dias. O que estamos dizendo aqui obtém todos os registros acima dos últimos 14 dias e abaixo dos últimos 7 dias. Este é um registro da semana em que você pode alterar o valor para 30 a 60 dias por um mês e também por um ano.

Obrigado Espero que ajude alguém.

A.Aleem11
fonte
-1

Você simplesmente faria isso:

SELECT (end_time - start_time) FROM t; -- return in Millisecond
SELECT (end_time - start_time)/1000 FROM t; -- return in Second
didxga
fonte
5
Cuidado: (fim - início) NÃO retorna uma diferença de segundos entre os valores de data e hora. Retorna um número que é a diferença entre números decimais que se parecem com aaaammddhhmmss.
precisa saber é o seguinte
-1

Por que não apenas

Selecione Soma (Data1 - Data2) da tabela

date1 e date2 são datetime

aikona
fonte
Isso não retorna a diferença de data em segundos; em vez disso, retorna a diferença entre números decimais que se parecem com aaaammddhhmmss. Portanto, isso não resolve a questão do OP. O mesmo é mencionado no comentário sobre a questão.
codeforester 29/03