Wyszukiwanie wydarzeń z ostatnich 30 dni
Innym częstym zadaniem jest wyszukiwanie wierszy należących do określonego zakresu dat. W zasadzie nie jest to trudne, jeśli data początkowa i końcowa zakresu są ustalone: SQL może porównywać daty równie dobrze jak liczby.
Operatory porównania można stosować do dat: < , > , <= , itd. Ponadto istnieje specjalny operator BETWEEN, który może również pracować z datami. Na przykład napiszmy zapytanie, które wybierze wszystkie zadania z tabeli zadań, które należy wykonać latem 2022 roku. Żądanie będzie wyglądać następująco:
SELECT * FROM task
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'
Wynikiem tego zapytania będzie:
ID | identyfikator_pracownika | nazwa | termin ostateczny |
---|---|---|---|
1 | 1 | Napraw błąd w interfejsie użytkownika | 2022-06-01 |
2 | 2 | Napraw błąd w backendzie | 2022-06-15 |
3 | 5 | Kup kawę | 2022-07-01 |
4 | 5 | Kup kawę | 2022-08-01 |
Ale co napisać we wniosku, jeśli chcemy dostać zadania np. z ostatnich 30 dni. Gdzie ostatnie 30 dni jest bezpośrednio powiązane z czasem wykonania zapytania. Oznacza to, że jeśli zapytanie zostanie wykonane 25 lipca, musisz wybrać daty od 25 czerwca do 24 lipca. Jak powiązać zakres dat z bieżącym czasem?
W tym celu użyj funkcji dodawania daty:
DATE_ADD (date, INTERVAL expression units)
Myślę, że łatwiej będzie to wyjaśnić na kilku przykładach:
# | Wniosek | Wynik |
---|---|---|
1 | DATE_ADD('2022-06-04', INTERWAŁ 5 DZIEŃ) | 2022-06-09 |
2 | DATE_ADD('2022-06-04', INTERWAŁ 4 TYDZIEŃ) | 2022-07-02 |
3 | DATE_ADD('2022-06-04', INTERWAŁ 2 MIESIĄCE) | 2022-08-04 |
4 | ||
5 | DATE_SUB('2022-06-04', INTERWAŁ 5 DZIEŃ) | 2022-05-30 |
6 | DATE_SUB('2022-06-04', INTERWAŁ 4 TYDZIEŃ) | 2022-05-07 |
7 | DATE_SUB('2022-06-04', INTERWAŁ 2 MIESIĄCE) | 2022-04-04 |
Nawiasem mówiąc, od określonej daty można również odjąć określoną liczbę dni, tygodni, miesięcy i lat.
A jeśli wrócimy do naszej prośby - aby uzyskać dane za ostatnie 30 dni, to potrzebujemy dwóch dat z tego zakresu:
- CURDATE() - koniec zakresu
- DATE_SUB( CURDATE() , INTERVAL 30 DAY) - początek zakresu
Żądanie będzie wyglądać następująco:
SELECT * FROM task WHERE task.deadline
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE()
Wynik tego zapytania będzie taki (mam dzisiaj 4 czerwca 2022 r.):
ID | identyfikator_pracownika | nazwa | termin ostateczny |
---|---|---|---|
1 | 1 | Napraw błąd w interfejsie użytkownika | 2022-06-01 |
Jak znaleźć różnicę między dwiema datami
I jeszcze jedna przydatna funkcja. Czasami może być konieczne obliczenie różnicy między dwiema datami w dniach. Aby to zrobić, SQL ma specjalną funkcję - DATEDIFF ().
Praca z nią jest bardzo łatwa:
DATEDIFF (date 1, date 2)
Druga data jest po prostu odejmowana od pierwszej daty. Jeśli data2 nastąpi po dacie1, wynik będzie ujemny.
Nawiasem mówiąc, możemy przepisać nasze poprzednie zapytanie za pomocą funkcji DATEDIFF(). Musimy wybrać wszystkie zadania z tabeli zadań, których termin różni się od aktualnej daty o nie więcej niż 30 dni. Oto jak wyglądałoby to żądanie:
SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30
Wynik tego zapytania będzie taki (mam dzisiaj 4 czerwca 2022 r.):
ID | identyfikator_pracownika | nazwa | termin ostateczny |
---|---|---|---|
1 | 1 | Napraw błąd w interfejsie użytkownika | 2022-06-01 |
2 | 2 | Napraw błąd w backendzie | 2022-06-15 |
3 | 5 | Kup kawę | 2022-07-01 |
Tym razem SQL znalazł aż trzy wiersze. Pomyśl, dlaczego ostatnim razem była jedna linia, a tym razem są trzy?