Archiwa tagu: datediff

SQL DATEDIFF

SQL DATEDIFF



DEFINICJA

Funkcja DATEDIFF() zwraca różnicę, w zdefiniowanych jednostkach, między dwiema datami. !!! UWAGA !!! nie we wszystkich środowiskach bazodanowych funkcja DATEDIFF() działa tak samo. Poniższe przykłady pochodzą z SQL SERVER-a.


SQL DATEDIFF() składnia funkcji

 

SELECT
DATEDIFF(parametr1 , parametr2 , parametr3)

parametry:
parametr1 – definiujemy w jakich jednostkach funkcja ma zwrócić różnicę np. jeśli w latach to YEAR, w miesiącach to MONTH itd
parametr2 – data początkowa (wcześniejsza)
parametr3 – data końcowa (późniejsza)


Przykład zastosowania DATEDIFF() (baza Adventureworks)

Wyświetl wszystkie zamówienia klienta o identyfikatorze 29825 i pokaż ile lat temu było składane każde z jego zamówień.

  SELECT
O.CustomerID AS [Identyfikator klienta]
,O.SalesOrderID AS [Identyfikator zamówienia]
,DATEDIFF( YEAR , O.OrderDate , GETDATE()) AS [Różnica w latach]
FROM
Sales.SalesOrderHeader O
WHERE
O.CustomerID = 29825


Przykład zastosowania DATEDIFF() (baza Northwind)

Oblicz staż pracy dla każdego pracownika.

  SELECT
E.LastName + ‚ ‚ + E.FirstName AS [Nazwisko i Imię]
,DATEDIFF( YEAR , E.HireDate , GETDATE()) AS [Staż Pracy]
FROM
Employees E


Odejmowanie dwóch dat (obecna – data zdarzenia) i prezentacja wyników w dniach

PROBLEM:

Odejmowanie dwóch dat (obecna – data zdarzenia) i prezentacja wyników w dniach

SZCZEGÓŁY:

Chciałbym odjąć dwie daty, obecną – data zdarzenia (np. data zapisania rekordu do bazy), w celu prezentacji wyników odejmowania w dniach. Jeśli zdarzenie (np. data zapisania rekordu do bazy) mała miejsce dzisiaj to w wyniku zapytania chcę otrzymać tekst „dzisiaj” i analogicznie jeśli zdarzenie miało miejsce wczoraj to chcę otrzymać tekst ‚wczoraj’ i tak samo z ‚przedwczoraj’. Jeśli zdarzenie miało miejsce później niż przedwczoraj to wynikiem odejmowania ma być prezentacja daty zdarzenia w formacie „Y-m-d”, czyli Rok-miesiąc-dzień.

ROZWIĄZANIE:

Możemy ten problem rozwiązać na poziomie aplikacji czy strony WWW, pobrać datę z bazy i porównać ją daty obecnej. Pewniejszym rozwiązaniem będzie uzyskanie potrzebnego wyniku od razy z zapytania SQL. W tym celu możemy skorzystać z funkcji DATEDIFF, która zwróci nam różnicę między parametrami (w tym przypadku datami). Aby uzyskać zadowalający nas efekt musimy jeszcze skorzystać z funkcji CASE która w zależności od wyniku odejmowania dat zwróci nam wartość o którą nam chodzi (‚dzisiaj’, ‚wczoraj’, ‚przedwczoraj’ lub datę zapisu rekordu do bazy inną nić wymienione).

SELECT
id
,tytul
,opis
,cena
,case(datediff(now(),data_dodania))               <- tutaj następuje odjęcie dat

WHEN 0 THEN ‚dzisiaj’      <- jeśli zdarzenie miało miejsce dzisiaj to różnicą w odejmowaniu jest 0, wtedy chcemy wyświetlić tekst  ‚dzisiaj’

WHEN 1 THEN ‚wczoraj’  <- jeśli zdarzenie miało miejsce wczoraj to różnicą w odejmowaniu jest 1, wtedy chcemy wyświetlić tekst  ‚wczoraj’

WHEN 2 THEN ‚przedwczoraj’   <- analogicznie jak wyżej

ELSE date(data_dodania) END as data_dodania   <- wszystkie inne przypadki to sytuacje kiedy zdarzenie miało miejsce wcześniej niż przedwczoraj i wtedy chcemy wyświetlić konkretną datę w formacie „Y-m-d”
,data_dodania as data_dodania_org   <- jeśli oryginalna data jest w formacie DATETIME to możemy ją wykorzystać do sortowania
FROM
tab1
WHERE
[..TUTAJ PODAJEMY WARUNKI WYSZUKIWANIA REKORDÓW…]
ORDER BY
data_dodania_org DESC   <- jak już wcześniej pisałem możemy wykorzystać oryginalną datę do sortowania

GOTOWE 🙂 MIŁEJ ZABAWY