¿Cómo obtener el número de días de diferencia entre dos fechas en mysql?

162

Necesito obtener el número de días contenidos en un par de fechas en MySQL.

Por ejemplo:

  • La fecha de entrada es 12-04-2010
  • Echa un vistazo a la fecha 15-04-2010

La diferencia del día sería 3

Audel
fuente

Respuestas:

261

¿Qué pasa con la función DATEDIFF ?

Citando la página del manual:

DATEDIFF () devuelve expr1 - expr2 expresado como un valor en días desde una fecha a la otra. expr1 y expr2 son expresiones de fecha o fecha y hora. Solo las partes de fecha de los valores se usan en el cálculo


En su caso, usaría:

mysql> select datediff('2010-04-15', '2010-04-12');
+--------------------------------------+
| datediff('2010-04-15', '2010-04-12') |
+--------------------------------------+
|                                    3 | 
+--------------------------------------+
1 row in set (0,00 sec)

Pero tenga en cuenta que las fechas deben escribirse como YYYY-MM-DD, y no DD-MM-YYYYcomo usted publicó.

Pascal MARTIN
fuente
sí, olvidé el formato de fecha cuando hice la pregunta; p gracias
Audel
44
PS YYYY-MM-DD es el estándar ISO 8601, por lo que todos deberían usar esto. Muy practico.
Ernestas Stankevičius
44
Nota : El primer argumento debe ser mayor que el segundo argumento para el datediff()método; de lo contrario, devolverá un valor negativo.
Shashanth
38

Tenga en cuenta que si desea contar FULL 24h días entre 2 fechas, dateiff puede devolverle valores incorrectos.

Como dice la documentación:

Solo las partes de fecha de los valores se utilizan en el cálculo.

lo que resulta en

select datediff('2016-04-14 11:59:00', '2016-04-13 12:00:00')

devuelve 1 en lugar del esperado 0.

La solución está usando select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00'); (tenga en cuenta el orden opuesto de los argumentos en comparación con dateiff).

Algunos ejemplos:

  • select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00'); devuelve 0
  • select timestampdiff(DAY, '2016-04-13 11:00:00', '2016-04-14 11:00:00'); devuelve 1
  • select timestampdiff(DAY, '2016-04-13 11:00:00', now()); devuelve cuántos días completos de 24h han pasado desde 2016-04-13 11:00:00 hasta ahora .

Espero que ayude a alguien, porque al principio no es muy obvio por qué dateiff devuelve valores que parecen ser inesperados o incorrectos.

Konrad Gałęzowski
fuente
raro que los argumentos se cambien entre datediff()y timestampdiff().
billynoah
17

Usa la DATEDIFF()función.

Ejemplo de documentación:

SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
    -> 1
Tobias Cohen
fuente
6

Prefiero TIMESTAMPDIFF porque puedes cambiar fácilmente la unidad si es necesario.

theblang
fuente
5

Obtener días entre la fecha actual y la fecha de destino

 SELECT DATEDIFF('2019-04-12', CURDATE()) AS days;

salida

dias

 335
vijayabalan
fuente
2
SELECT md.*, DATEDIFF(md.end_date, md.start_date) AS days FROM  membership_dates md

salida::

id  entity_id    start_date            end_date             days

1   1236      2018-01-16 00:00:00     2018-08-31 00:00:00    227
2   2876      2015-06-26 00:00:00     2019-06-30 00:00:00   1465
3   3880      1990-06-05 00:00:00     2018-07-04 00:00:00   10256
4   3882      1993-07-05 00:00:00     2018-07-04 00:00:00   9130

espero que ayude a alguien en el futuro

Desarrollador
fuente