@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 formatSELECT 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.
¿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().
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:
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')
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
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í
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 resultsset@StartDate ='2013-12-30'--birthdateset@EndDate = Getdate()--current datetime--calculate yearsselect@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 =casewhen datediff(month,@StartDate,@EndDate)-( datediff(year,@StartDate,@EndDate)*12)<0then-1else1end--decrease year by 1 if months are Overflowedselect@Years =casewhen@monthOverflow <0then@years-1 else@years endselect@months = datediff(month,@StartDate,@EndDate)-(@years *12)--as we do for month overflow criteria for days and hours --& minutes logic will followed same waydeclare@LastdayOfMonth int
select@LastdayOfMonth = datepart(d,DATEADD
(s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate)+1,0)))select@days =casewhen@monthOverflow<0and
DAY(@StartDate)> DAY(@EndDate)then@LastdayOfMonth +(datepart(d,@EndDate)- datepart(d,@StartDate))-1else datepart(d,@EndDate)- datepart(d,@StartDate)endselect@Months=casewhen@days <0or DAY(@StartDate)> DAY(@EndDate)then@Months-1 else@Months endDeclare@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 =casewhen(@lastdayBirthdate >@lastdayAsOnDate)then@lastdayBirthdate +@Days
else@lastdayAsOnDate +@Days
end)printconvert(varchar,@years)+' year(s), '+convert(varchar,@months)+' month(s), '+convert(varchar,@days)+' day(s) '
¿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 isfor 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 isfor 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.
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.
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.
Respuestas:
Por lo tanto, puede usar
TIMESTAMPDIFF
para su propósito.fuente
TIMEDIFF
por24*60*60
no es igual al resultado deTIMESTAMPDIFF
.TIMEDIFF()
espera que los argumentos de tiempo de inicio y finalización estén en el orden opuesto al esperadoTIMESTAMPDIFF()
.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:
fuente
DATEDIFF
no devuelve fraccionesObtenga la diferencia de fecha en días usando DATEDIFF
O
Consulte el siguiente enlace MySql diferencia entre dos marcas de tiempo en días?
fuente
SELECT * FROM table where datediff(today,databasedate) as days =3;
algo como estofuente
fuente
Segundo enfoque
SELECT ( DATEDIFF('1993-02-20','1993-02-19')*( 24*60*60) )AS 'seccond';
fuente
O bien, puede usar la función TIMEDIFF
fuente
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í
fuente
OK, no es exactamente lo que pidió el OP, pero es lo que quería hacer :-)
fuente
Este código calcula la diferencia entre dos fechas en formato aaaa MM dd.
fuente
TIMESTAMPDIFF
función?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:
% 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.
fuente
Simplemente harías esto:
fuente
¿Por qué no solo
Seleccione Suma (Fecha1 - Fecha2) de la tabla
date1 y date2 son datetime
fuente