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

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ś.


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.


dziwne, że argumenty są odwracane między datediff()a timestampdiff().
billynoah



5

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

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

wynik

dni

 335

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.