Diferencia entre dos fechas en MySQL

173

¿Cómo calcular la diferencia entre dos fechas, en el formato YYYY-MM-DD hh: mm: ssy obtener el resultado en segundos o milisegundos?

GeoGo
fuente
14
@didxga: Cuidado: (fin - inicio) NO devuelve una diferencia de segundos entre los valores de fecha y hora. Devuelve un número que es la diferencia entre los números decimales que parecen aaaammddhhmmss.
helloPiers

Respuestas:

330
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

Por lo tanto, puede usar TIMESTAMPDIFFpara su propósito.

Devid G
fuente
2
¿Qué significa exactamente "la diferencia en segundos por días"? No entiendo por qué multiplicar el resultado de TIMEDIFFpor 24*60*60no es igual al resultado de TIMESTAMPDIFF.
David Tuite
¡Esta solución funcionó para mí! Pero en mi caso, me gustaría realizar el TIMESTAMPDIFF en DAY, pero sin considerar los fines de semana (sábado / domingo). Quiero decir, solo la diferencia de días de semana ... ¿Es posible de una manera simple? Si no, pido disculpas por las molestias y luego buscaré otra solución. TKs.
Massa
8
TIMEDIFF en el ejemplo es incorrecto ya que ese no es el número de segundos entre esos dos días. TIMEDIFF devuelve un valor de TIEMPO, que tiene horas, minutos y segundos de la diferencia. Multiplicarlo no dará una respuesta útil. Use TIMESTAMPDIFF.
IvanD
44
Interesante que TIMEDIFF()espera que los argumentos de tiempo de inicio y finalización estén en el orden opuesto al esperado TIMESTAMPDIFF().
LS
1
Nota: Al usar la función TIMEDIFF, el valor del tiempo puede variar de "-838: 59: 59" a "838: 59: 59". w3schools.com/SQl/func_mysql_timediff.asp
cREcker
38

Si está trabajando con columnas DATE (o puede convertirlas como columnas de fecha), pruebe DATEDIFF () y luego multiplique por 24 horas, 60 min, 60 segundos (ya que DATEDIFF devuelve diff en días). De MySQL:

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

por ejemplo:

mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30 00:00:00') * 24*60*60
kvista
fuente
55
No creo que esto funcione. DATEDIFFno devuelve fracciones
Juan Carlos Oropeza
29

Obtenga la diferencia de fecha en días usando DATEDIFF

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

O

Consulte el siguiente enlace MySql diferencia entre dos marcas de tiempo en días?

Kailas
fuente
querido, es perfecto para la pregunta anterior, pero quiero alguna modificación con la misma consulta, por lo que podría ayudarme a saber cómo se puede lograr eso. aquí quiero comparar el resultado final con mi valor, como SELECT * FROM table where datediff(today,databasedate) as days =3;algo como esto
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')
Romancha KC
fuente
4
select 
unix_timestamp('2007-12-30 00:00:00') - 
unix_timestamp('2007-11-30 00:00:00');
ajreal
fuente
3
unix_timestamp: una forma estándar de temporización en los sistemas tipo Unix. Representa un número entero de 32 bits, que indica cuántos segundos han pasado desde el 01/01/1970 00:00:00. Es decir, un límite inferior. El límite superior está limitado a 2.106 al año, pero debido a que los programas frecuentes no funcionan con este valor (en lugar de un entero sin signo usando un entero con signo) se considera el límite superior en 2038.
Devid G
+ al pasar por el horario de verano se deduce / agrega incorrectamente
Devid G
1
SELECT TIMESTAMPDIFF(SECOND,'2018-01-19 14:17:15','2018-01-20 14:17:15');

Segundo enfoque

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
fuente
0

O bien, puede usar la función 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
fuente
TC quiere obtener el valor de los resultados en segundos o milisegundos.
Devid G
0

Esta función toma la diferencia entre dos fechas y la muestra en un formato de fecha aaaa-mm-dd. Todo lo que necesita es ejecutar el siguiente código y luego usar la función. Después de ejecutar puedes usarlo así

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;
enorme
fuente
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, no es exactamente lo que pidió el OP, pero es lo que quería hacer :-)

Chico
fuente
0

Este código calcula la diferencia entre dos fechas en formato aaaa MM dd.

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
fuente
¿Por qué no simplemente usar la TIMESTAMPDIFFfunción?
codeforester
0

Si tiene una fecha almacenada en el campo de texto como cadena, puede implementar este código, obtendrá la lista de la cantidad de días pasados ​​por semana, un mes o un año:

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 es su formato de fecha

Esta consulta muestra el registro entre los días que configuró allí, como: A continuación de los últimos 7 días y Arriba de los últimos 14 días, por lo que sería su último registro de la semana que se muestre el mismo concepto para el mes o año. Cualquiera que sea el valor que proporcione en la fecha a continuación, como: debajo de 7 días, por lo que el otro valor sería el doble de 14 días. Lo que estamos diciendo aquí obtiene todos los registros anteriores de los últimos 14 días y inferiores de los últimos 7 días. Este es un registro semanal en el que puede cambiar el valor a 30-60 días por un mes y también por un año.

Gracias Espero que ayude a alguien.

A.Aleem11
fuente
-1

Simplemente harías esto:

SELECT (end_time - start_time) FROM t; -- return in Millisecond
SELECT (end_time - start_time)/1000 FROM t; -- return in Second
didxga
fuente
55
Cuidado: (final - inicio) NO devuelve una diferencia de segundos entre los valores de fecha y hora. Devuelve un número que es la diferencia entre los números decimales que parecen aaaammddhhmmss.
helloPiers
-1

¿Por qué no solo

Seleccione Suma (Fecha1 - Fecha2) de la tabla

date1 y date2 son datetime

aikona
fuente
Esto no devuelve la diferencia de fecha en segundos, sino que devuelve la diferencia entre los números decimales que parecen aaaammddhhmmss. Entonces, esto no resuelve la pregunta de OP. Lo mismo se menciona en el comentario sobre la pregunta también.
codeforester