Jak uzyskać liczbę dni różnicy między dwiema datami w mysql?

162

Muszę uzyskać liczbę dni zawartych w kilku datach w MySQL.

Na przykład:

  • Data zameldowania to 12-04-2010
  • Sprawdź datę 15-04-2010

Różnica dzienna wynosiłaby 3

Audel
źródło

Odpowiedzi:

261

A co z funkcją DATEDIFF ?

Cytując stronę podręcznika:

DATEDIFF () zwraca wyrażenie1 - wyrażenie2 wyrażone jako wartość w dniach od jednej daty do drugiej. wyrażenie1 i wyrażenie2 są wyrażeniami typu data lub data i czas. W obliczeniach używane są tylko części wartości dotyczące daty


W twoim przypadku użyłbyś:

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

Ale pamiętaj, że daty powinny być zapisane jako YYYY-MM-DD, a nie DD-MM-YYYYtak, jak opublikowałeś.

Pascal MARTIN
źródło
tak, zapomniałem o formacie daty, kiedy zadałem pytanie; p dziękuję
Audel
4
PS RRRR-MM-DD to standard ISO 8601, więc każdy powinien go używać. Bardzo praktyczne.
Ernestas Stankevičius
4
Uwaga : Pierwszy argument musi być większy niż drugi argument datediff()metody, w przeciwnym razie zwróci wartość ujemną.
Shashanth
38

Zwróć uwagę, że jeśli chcesz liczyć PEŁNE 24-godzinne dni między dwiema datami, datediff może zwrócić nieprawidłowe wartości.

Jak stwierdza dokumentacja:

W obliczeniach używane są tylko części wartości dotyczące daty.

Co skutkuje w

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

zwraca 1 zamiast oczekiwanego 0.

Rozwiązanie używa select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00'); (zwróć uwagę na odwrotną kolejność argumentów w porównaniu z datediff).

Kilka przykładów:

  • select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00'); zwraca 0
  • select timestampdiff(DAY, '2016-04-13 11:00:00', '2016-04-14 11:00:00'); zwraca 1
  • select timestampdiff(DAY, '2016-04-13 11:00:00', now()); zwraca ile pełnych 24-godzinnych dni minęło od 13.04.2016 od 11:00:00 do teraz .

Mam nadzieję, że to komuś pomoże, ponieważ na początku nie jest zbyt oczywiste, dlaczego datediff zwraca wartości, które wydają się nieoczekiwane lub błędne.

Konrad Gałęzowski
źródło
dziwne, że argumenty są odwracane między datediff()a timestampdiff().
billynoah
17

Użyj DATEDIFF()funkcji.

Przykład z dokumentacji:

SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
    -> 1
Tobias Cohen
źródło
6

Wolę TIMESTAMPDIFF, ponieważ w razie potrzeby możesz łatwo zmienić jednostkę.

theblang
źródło
5

Uzyskaj dni między bieżącą datą a datą docelową

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

wynik

dni

 335
vijayabalan
źródło
2
SELECT md.*, DATEDIFF(md.end_date, md.start_date) AS days FROM  membership_dates md

wynik::

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

mam nadzieję, że pomoże to komuś w przyszłości

Deweloper
źródło