2010-03-30 30 views
41

¿Cómo puedo obtener la diferencia entre dos marcas de tiempo en días? ¿Debo utilizar una columna de fecha y hora para esto? ¿Diferencia de MySql entre dos marcas de tiempo en días?


Cambié mi columna a fecha y hora. La sustracción simple no parece darme un resultado en días.

mysql> SELECT NOW(), last_confirmation_attempt, NOW() - last_confirmation_attempt AS diff FROM DateClubs HAVING diff IS NOT NULL ; 
+---------------------+---------------------------+-----------------+ 
| NOW()    | last_confirmation_attempt | diff   | 
+---------------------+---------------------------+-----------------+ 
| 2010-03-30 10:52:31 | 2010-03-16 10:41:47  | 14001084.000000 | 
+---------------------+---------------------------+-----------------+ 
1 row in set (0.00 sec) 

No creo diff está en segundos, porque cuando divido diff por número de segundos en un día (86.400), no obtener una respuesta sensical:

mysql> SELECT NOW(), last_confirmation_attempt, (NOW() - last_confirmation_attempt)/86400 AS diff FROM DateClubs HAVING diff IS NOT NULL ; 
+---------------------+---------------------------+----------------+ 
| NOW()    | last_confirmation_attempt | diff   | 
+---------------------+---------------------------+----------------+ 
| 2010-03-30 10:58:58 | 2010-03-16 10:41:47  | 162.0568402778 | 
+---------------------+---------------------------+----------------+ 
1 row in set (0.00 sec) 
+0

¿Qué tipo de datos son sus columnas/valores en este momento? –

+0

Estaba usando marcas de tiempo, pero acabo de cambiar una columna por fecha y hora. – user151841

Respuesta

92

Si está contento de ignorar la porción de tiempo en las columnas, DATEDIFF() le dará la diferencia que está buscando en días.

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

También buscaba en Google cómo encontrar la diferencia entre la fecha actual, así que déjela aquí: 'DATEDIFF (CURDATE(), '2015-04-18')'. – ivkremer

4
CREATE TABLE t (d1 timestamp, d2 timestamp); 

INSERT INTO t VALUES ('2010-03-11 12:00:00', '2010-03-30 05:00:00'); 
INSERT INTO t VALUES ('2010-03-11 12:00:00', '2010-03-30 13:00:00'); 
INSERT INTO t VALUES ('2010-03-11 00:00:00', '2010-03-30 13:00:00'); 
INSERT INTO t VALUES ('2010-03-10 12:00:00', '2010-03-30 13:00:00'); 
INSERT INTO t VALUES ('2010-03-10 12:00:00', '2010-04-01 13:00:00'); 

SELECT d2, d1, DATEDIFF(d2, d1) AS diff FROM t; 

+---------------------+---------------------+------+ 
| d2     | d1     | diff | 
+---------------------+---------------------+------+ 
| 2010-03-30 05:00:00 | 2010-03-11 12:00:00 | 19 | 
| 2010-03-30 13:00:00 | 2010-03-11 12:00:00 | 19 | 
| 2010-03-30 13:00:00 | 2010-03-11 00:00:00 | 19 | 
| 2010-03-30 13:00:00 | 2010-03-10 12:00:00 | 20 | 
| 2010-04-01 13:00:00 | 2010-03-10 12:00:00 | 22 | 
+---------------------+---------------------+------+ 
5 rows in set (0.00 sec) 
11

lo que sé es bastante antiguo, pero lo diré sólo por el hecho de que - que estaba buscando el mismo problema y llegué aquí, pero necesitaba la diferencia en días.

I utilizarse SELECT (UNIX_TIMESTAMP(DATE1) - UNIX_TIMESTAMP(DATE2))/60/60/24 UNIX_TIMESTAMP devuelve la diferencia en segundos, y entonces sólo se dividen en minutos (segundos/60), horas (minutos/60), días (hora/24).

+0

¿Esto maneja adecuadamente los años bisiestos? – user151841

+1

Sí, porque la marca de tiempo maneja los años bisiestos. La diferencia de marca de tiempo devuelve la diferencia entre dos fechas en segundos. Si divides hasta el día, estás bien (cada día todos los años tiene la misma cantidad de segundos). – Enrico

+1

@Enrico - No es cierto. Algunos días tienen un segundo o dos segundos adicionales dependiendo del año. Estos ocurren en la medianoche del 30 de junio o en la medianoche del 31 de diciembre.Son segundos intercalares que se ajustan a la deriva entre los segundos medios solares del día frente al segundo reloj atómico. Si revisa las calculadoras UNIX y SQL, permitirán un minuto 62, lo que significa que los valores de los segundos pueden oscilar entre 0 y 61 inclusive. El ajuste también puede ser negativo en dos segundos, pero eso nunca ha ocurrido, ya que la deriva es siempre hacia la necesidad de segundos intercalares positivos. El estándar permite hasta 2 segundos. – Jim

3

SELECT DATEDIFF(now(), '2013-06-20');

aquí datediff toma dos argumentos 'hasta la fecha', 'de día'

lo que he hecho está, ahora usando la función(), i puedo obtener ninguna. de días desde el 20 de junio de 2013 hasta hoy.

5

Si desea volver en formato de hora completa de probarlo: -

SELECT TIMEDIFF(`call_end_time`, `call_start_time`) as diff from tablename; 

vuelta como

 diff 
    - - - 
    00:05:15 
3

Si necesita la diferencia en días lo que representa hasta el segundo:

SELECCIONAR TIMESTAMPDIFF (SEGUNDO, '2010-09-21 21:40:36', '2010-10-08 18:23:13')/86400 AS diff

devolverá 16.8629 días.

0

SELECCIONAR DATEDIFF (max_date, min_date) como días de mi tabla. Esto funciona incluso si el col max_date y min_date están en tipos de datos de cadena.

Cuestiones relacionadas