2011-01-21 23 views
112

¿Cómo se calcula la diferencia entre dos fechas, en el formato YYYY-MM-DD hh: mm: ss y para obtener el valor del resultado en segundos o milisegundos?Diferencia entre dos fechas en MySQL

+11

@didxga: Cuidado: (final - inicial) no devuelve la diferencia entre los valores de fecha y hora segundos. Devuelve un número que es la diferencia entre los números decimales que se parecen a aaaammddhhmmss. – helloPiers

Respuesta

215
SELECT TIMEDIFF('2007-12-31 10:02:00','2007-12-30 12:01:01'); 
-- result: 22:00:59. 


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

nice! TIMESTAMPDIFF ¡Funciona a la perfección! ¡Gracias! – GeoGo

+1

¿Qué significa "la diferencia en segundos por días" exactamente? No entiendo por qué multiplicar el resultado de 'TIMEDIFF' por' 24 * 60 * 60' no es igual al resultado de 'TIMESTAMPDIFF'. –

+0

¡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 la semana ... ¿Es posible de una manera simple? Si no, me disculpo por las molestias y luego buscaré otra solución. TKs. – Massa

32

Si está trabajando con columnas DATE (o puede convertirlas en columnas de fecha), intente DATEDIFF() y luego multiplique por 24 horas, 60 min, 60 segundos (ya que DATEDIFF devuelve diff en días). A partir 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 
+1

No creo que esto funcione. 'DATEDIFF' no devuelve fracciones. –

0

O bien, puede utilizar 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' 
+0

TC quiere obtener el valor de los resultados en segundos o milisegundos. –

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

unix_timestamp - una forma estándar de sincronización en los sistemas de tipo Unix. Representa un entero de 32 bits, que indica cuántos segundos han pasado desde 01/01/1970 00:00:00. Es decir, un límite inferior. El límite superior está limitado a 2.106 por año, pero debido a programas frecuentes no funciona con este valor (en lugar de un entero sin signo que usa un entero con signo) se considera el límite superior en 2038. –

+0

+ al pasar por el horario de verano se deduce incorrectamente/agregó –

0

Esta función toma la diferencia entre dos fechas y 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 la ejecución se puede utilizar de esta manera

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 

- resultado: 01:48:00

bien no es exactamente lo que hizo la OP, pero es lo que quería Qué :-)

+0

Creo que la respuesta aceptada actual es mejor. – ForceMagic

7
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') 
-1

Usted simplemente hacer esto:

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

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 se parecen a aaaammddhhmmss. – helloPiers

0

Esta diferencia calcular el código entre dos fechas en formato dd aaaa MM.

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) ' 
0

¿Por qué no

select sum (Fecha1 - Fecha2) de la tabla

fecha1 y la fecha 2 de fecha y hora son

0

Si ha almacenado una fecha en el campo de texto como cadena que pueda implementar este código, obtendrá la lista de los últimos días de una semana, un mes o un año de clasificación:

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 estableció como: Debajo de los últimos 7 días y Arriba de los últimos 14 días, por lo que sería su último registro semanal para mostrar el mismo concepto es por mes o año. Cualquiera que sea el valor que proporcione en una fecha inferior como: a continuación, de 7 días, el otro valor sería el doble de 14 días.Lo que estamos diciendo aquí es que obtenga todos los registros anteriores de los últimos 14 días y menos de los últimos 7 días. Este es un registro semanal 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.

0
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 
Cuestiones relacionadas