Como obter o número de dias de diferença entre duas datas no mysql?

162

Eu preciso obter o número de dias contidos em algumas datas no MySQL.

Por exemplo:

  • A data de check-in é 12-04-2010
  • Data de check-out 15-04-2010

A diferença do dia seria 3

Audel
fonte

Respostas:

261

E a função DATEDIFF ?

Citando a página do manual:

DATEDIFF () retorna expr1 - expr2 expresso como um valor em dias de uma data para a outra. expr1 e expr2 são expressões de data ou data e hora. Somente as partes da data dos valores são usadas no cálculo


No seu caso, você usaria:

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

Mas observe que as datas devem ser escritas como YYYY-MM-DDe não DD-MM-YYYYcomo você postou.

Pascal MARTIN
fonte
sim eu esqueci sobre o formato da data, quando eu fiz a pergunta; p obrigado
Audel
4
PS AAAA-MM-DD é o padrão ISO 8601, portanto todos devem usar isso. Muito prático.
Ernestas Stankevičius
4
Nota : O primeiro argumento deve ser maior que o segundo argumento paradatediff() método, caso contrário, ele retornará valor negativo.
Shashanth
38

Observe que se você quiser contar 24 horas por dia, entre 2 datas, datediff pode retornar valores incorretos para você.

Como a documentação declara:

Somente as partes da data dos valores são usadas no cálculo.

o que resulta em

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

retorna 1 em vez do esperado 0.

A solução está sendo usada select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00'); (observe a ordem oposta dos argumentos em comparação com datediff).

Alguns exemplos:

  • select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00'); retorna 0
  • select timestampdiff(DAY, '2016-04-13 11:00:00', '2016-04-14 11:00:00'); retorna 1
  • select timestampdiff(DAY, '2016-04-13 11:00:00', now()); retorna quantos dias completos de 24 horas se passaram desde 13-04-2016 11:00:00 até agora .

Espero que ajude alguém, porque, a princípio, não é muito óbvio por que datatediff retorna valores que parecem inesperados ou errados.

Konrad Gałęzowski
fonte
estranho que os argumentos sejam invertidos entre datediff()e timestampdiff().
Billynoah
17

Use o DATEDIFF() função

Exemplo da documentação:

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

Prefiro TIMESTAMPDIFF porque você pode facilmente mudar a unidade, se necessário.

theblang
fonte
5

Obter dias entre a data atual e a data de destino

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

resultado

dias

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

resultado::

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 ajude alguém no futuro

Desenvolvedor
fonte