Database
 sql >> Baza danych >  >> RDS >> Database

Korzystanie z funkcji T-SQL DATEADD, DATEDIFF i DATEPART w prostych terminach

Ten artykuł koncentruje się na rozwinięciu podstawowej wiedzy na temat korzystania z jednej z najpopularniejszych funkcji daty Transact-SQL:DATEADD, DATEDIFF i DATEPART.

W tym artykule podkreśliłem również znaczenie prawidłowego używania tych funkcji daty w codziennych manipulacjach datami, po których nastąpiło kilka interesujących scenariuszy, w których te funkcje daty mogą być używane wspólnie do rozwiązywania nieco skomplikowanych obliczeń dat.

Ponieważ te funkcje są używane głównie do manipulacji datami, spróbujmy najpierw zrozumieć, co rozumiemy przez manipulację datą.

Zrozumienie manipulacji datami

Wartości daty i czasu często muszą być modyfikowane zgodnie z wymaganiami, a metoda modyfikowania lub obsługi lub kontrolowania obliczeń daty i czasu jest znana jako manipulacja datą.

Odnosimy się również do tej sytuacji (manipulacji datą), gdy wartość daty jest odczytywana z bazy danych, a następnie modyfikowana, zanim zostanie ponownie zapisana.

Scenariusz zamówienia klienta

Ciekawym przykładem manipulacji datami jest zamówienie klienta scenariusz, gdy zamówienie umieszczone przez klienta jest przetwarzany, data dostawy należy ustawić 5 dni przed datą zamówienia , co oznacza, że ​​programista musi używać funkcji daty T-SQL do manipulowania (modyfikowania) daty zamówienia obliczyć datę dostawy .

Przykładowy dzienny raport sprzedaży

Nieco złożonym przykładem jest sytuacja, w której użytkownik biznesowy uruchamia Dzienny raport sprzedaży jeśli pokazuje wczorajsze wyniki.

Na przykład, jeśli uruchomimy Dzienny raport sprzedaży w niedzielę o 11:00 pokaże nam wyniki na podstawie soboty, a jeśli uruchomimy go w sobotę o 17:00, pokaże nam wszystkie wyniki w piątek, ponieważ bieżący dzień jeszcze się nie skończył i najnowszy cały dostępny dzień to wczoraj. W ten sposób zaprojektowano większość profesjonalnych raportów dziennych, w tym raportów finansowych.

W tym przykładzie bieżąca data jest manipulowany (zmodyfikowany), aby uzyskać poprzednią datę, która zawiera rekordy sprzedaży z całego dnia.

Implementacja przykładów

Pamiętaj o powyższych przykładach, ponieważ zaimplementujemy te scenariusze, gdy zrozumiemy, jak używać niektórych z najpopularniejszych funkcji daty opisanych w tym artykule.

Zrozumienie funkcji daty

Przyjrzyjmy się najpierw podstawowym funkcjom dat, które mogą nam pomóc w spełnieniu wymagań dotyczących manipulacji datami, takich jak określanie dni pomiędzy dwiema datami (data zamówienia i data dostawy), uzyskiwanie rekordów sprzedaży z ostatniego tygodnia na podstawie bieżącej daty lub obliczanie oczekiwanej daty wygaśnięcia na podstawie data produkcji itd.

Ponieważ nie ma twardych i szybkich reguł, najpierw zaczynamy odkrywać funkcję DATEPART.

Korzystanie z funkcji DATEPART

Prosta definicja

Funkcja DATEPART służy do zwracania części podanej daty w wartości liczbowej.

Częścią może być dzień daty, miesiąc daty, rok daty itp.

Na przykład możemy użyć funkcji DATEPART, aby uzyskać dzień podanej daty, aby określić, czy zamówienie zostało złożone w niedzielę, czy nie.

Innym przykładem jest pobranie miesiąca z danej daty do przekazania do innej funkcji daty w celu dalszego przetwarzania.

Definicja Microsoft

Ta funkcja zwraca liczbę całkowitą reprezentującą określoną datapart podanej daty .

Kompatybilność

Zgodnie z dokumentacją Microsoft ta funkcja jest kompatybilna z następującymi wersjami SQL Server:

  1. SQL Server 2008 plus
  2. Baza danych Azure SQL
  3. Azure SQL Data Warehouse
  4. Równoległa hurtownia danych

Składnia

DATEPART (datepart , date)

Przykład 1:Pobieranie roku jako części daty

Zdefiniujmy również konkretną datę (DataZamówienia ), aby uzyskać żądaną część (dzień, miesiąc, rok) za pomocą funkcji DATEPART.

Aby otrzymać Rok z daty zamówienia, po prostu mijamy ROK a następnie Data zamówienia (@OrderDate) w DATEPART działają w następujący sposób:

-- Define Order Date
DECLARE @OrderDate DATETIME2='2017-01-11'

-- Getting Year of the Order Date
SELECT DATEPART(YEAR,@OrderDate) as Year_OrderDate

Przykład 2:Pobieranie części miesiąca

Jeśli interesuje nas miesiąc daty, to Miesiąc należy przekazać do DATEPART działają w następujący sposób:

-- Define Order Date
DECLARE @OrderDate DATETIME2='2017-01-11'

-- Getting Month of the Order Date
SELECT DATEPART(MONTH,@OrderDate) as Month_OrderDate

Przykład 3:Część dnia

Aby znaleźć część dnia dnia, po prostu miń DZIEŃ w DATEPART działają w następujący sposób:

-- Define Order Date
DECLARE @OrderDate DATETIME2='2017-01-11'

-- Getting Day of the Order Date
SELECT DATEPART(DAY,@OrderDate) as Day_OrderDate

Przykład 4:uzyskanie części dnia tygodnia

Aby otrzymać część dnia tygodnia, po prostu miń WEEKDAY w DATEPART działają w następujący sposób:

-- Define Order Date
DECLARE @OrderDate DATETIME2='2017-01-11'

-- Getting Week Day of the Order Date
SELECT DATEPART(WEEKDAY,@OrderDate) as WeekDay_OrderDate

Otrzymujemy 4, czyli środę, począwszy od niedzieli, czyli 1.

Podobnie możemy również uzyskać kwadrans, godzinę, minutę, drugą część daty.

Przejdźmy do następnej funkcji daty.

Korzystanie z funkcji DATEADD

Prosta definicja

Funkcja DATEADD służy do dodawania lub odejmowania daty.

Na przykład możemy dowiedzieć się, jaka będzie data po czterech dniach lub czterech dniach wcześniej.

Jest to bardzo przydatne w scenariuszach, w których oczekiwana data musi być obliczona na podstawie podanej daty, np. data wygaśnięcia członkostwa musi wynosić dokładnie rok od daty rejestracji.

Innym przykładem jest obliczenie daty zakończenia kursu, która musi przypadać dokładnie dwa miesiące po dacie rozpoczęcia kursu.

Definicja Microsoft

Ta funkcja dodaje określony liczbę wartość (jako liczba całkowita ze znakiem) do określonej datapart wejścia data wartość, a następnie zwraca tę zmodyfikowaną wartość.

Kompatybilność

Zgodnie z dokumentacją Microsoft ta funkcja jest kompatybilna z następującymi wersjami SQL Server:

  1. SQL Server 2008 plus
  2. Baza danych Azure SQL
  3. Azure SQL Data Warehouse
  4. Równoległa hurtownia danych

Składnia

DATEADD (datepart, number, date)

Datepart to dowolna część daty, taka jak dzień, miesiąc, rok, dzień tygodnia, godzina itp.

Liczba jest wtedy numerem części daty (dzień, miesiąc, rok itp.), która ma zostać dodana lub odjęta

Data to podana data, którą należy dodać lub odjąć za pomocą funkcji DATEADD

Przykład 1:uzyskanie daty następnego roku

Zdefiniujmy również określoną datę (Data rejestracji), która zostanie dodana lub odjęta za pomocą DATEADD funkcjonować w oparciu o wymagania.

Datę następnego roku można uzyskać, dodając 1 do części daty Rok.

Aby uzyskać następny rok od daty rejestracji, po prostu dodajemy DatePart Rok następnie 1, a następnie Data rejestracji (@RegistrationDate) w DATEADD działają w następujący sposób:

-- Define Registration Date
DECLARE @RegDate DATETIME2='2018-07-10'

-- Getting Next Year from registratoin date
SELECT DATEADD(YEAR,1,@RegDate) as NextYear_RegDate

Przykład 2:uzyskanie daty następnego miesiąca

Aby otrzymać datę następnego miesiąca, miń MIESIĄC datepart do DATEADD funkcja, po której następuje liczba miesięcy, które chcemy dodać, a następnie podana data, która w naszym przypadku jest datą rejestracji (RegDate).

-- Define Registration Date
DECLARE @RegDate DATETIME2='2018-07-10'
SELECT @RegDate AS RegDate -- Show Registration Date

-- Getting Next MONTH from the registratoin date
SELECT DATEADD(MONTH,1,@RegDate) as NextMonth_RegDate

Przykład 3:Uzyskanie daty następnego dnia

Jeśli kurs rozpocznie się następnego (następnego) dnia rejestracji, musimy zaliczyć DZIEŃ z 1 ponieważ następny dzień dodaje kolejny dzień do daty rejestracji, co przedstawia się następująco:

-- Define Registration Date
DECLARE @RegDate DATETIME2='2018-07-10'
SELECT @RegDate AS RegDate -- Show Registration Date

-- Getting Next DAY from registratoin date
SELECT DATEADD(DAY,1,@RegDate) as NextDAY_RegDate

Przykład 4:Ustawianie daty dziennego raportu sprzedaży

Teraz skupmy się na nieco złożonym scenariuszu często używanym przy tworzeniu codziennych raportów finansowych.

Jeśli chcemy utworzyć dzienny raport sprzedaży, powinien on pokazywać wczorajsze dane, ponieważ bieżący dzień nie jest jeszcze zakończony, a ostatni pełny dzień to wczoraj, jak omówiono na początku tego artykułu.

Na koniec musimy również przekonwertować wczorajszą datę i godzinę na wartość zawierającą tylko datę, aby ułatwić raportowi objęcie całego dnia.

Aby uzyskać wczorajszą datę na podstawie dzisiejszej daty, musimy dodać „-1 dzień” do bieżącej daty w następujący sposób:

-- Define Current Date
DECLARE @CurrentDate DATETIME2=GETDATE()
SELECT @CurrentDate AS CurrentDate -- Show Registration Date

-- Getting Yesterday Date and Time from current date
SELECT DATEADD(DAY,-1,@CurrentDate) as YesterdayDateTime_CurrentDate

-- Converting Yesterday DateTime into Date only
SELECT CAST(DATEADD(DAY,-1,@CurrentDate) AS DATE)as YesterdayDateOnly_CurrentDate

Korzystanie z funkcji DATEDIFF

Prosta definicja

Funkcja DATEDIFF służy do określenia różnicy w dniach, miesiącach, latach, godzinach itp. między dwiema datami.

Na przykład możemy dowiedzieć się, ile dni minęło między dwiema datami.

Jest to również bardzo przydatne w scenariuszach, w których musimy zbadać różnicę między oczekiwaną datą dostawy zamówienia a rzeczywistą datą dostawy zamówienia.

Innym przykładem jest śledzenie czasu, co oznacza zrozumienie, ile godzin spędziliśmy nad konkretnym projektem od jego rozpoczęcia do teraz.

Definicja Microsoft

Ta funkcja zwraca liczbę (jako liczbę całkowitą ze znakiem) określonych granic części daty przekroczonych między określoną data rozpoczęcia i data końcowa .

Kompatybilność

Zgodnie z dokumentacją Microsoft ta funkcja jest kompatybilna z następującymi wersjami SQL Server:

  1. SQL Server 2008 plus
  2. Baza danych Azure SQL
  3. Azure SQL Data Warehouse
  4. Równoległa hurtownia danych

Składnia

DATEDIFF ( datepart , startdate , enddate )

Datepart to dowolna część daty, taka jak dzień, miesiąc, rok, dzień tygodnia, godzina itp.

Przykład 1:Zrozumienie różnicy w dniach

Spróbujmy zrozumieć, jak DATEDIFF funkcja działa.

Jeśli spróbujemy znaleźć różnicę w dniach między 01 lipca 2018 a 02 lipca 2018, otrzymamy 1 dzień, co oznacza, że ​​odejmuje się datę zakończenia od daty rozpoczęcia, aby uzyskać różnicę:

SELECT DATEDIFF(DAY,'01 JULY 2018','02 JULY 2018') AS Days_Between_Two_Consecutive_Dates
SELECT DATEDIFF(DAY,'01 JULY 2018','03 JULY 2018') AS Days_Between_01_July_03_July

Przykład 2:Uzyskiwanie dni między zamówieniem a dostawą

Zdefiniujmy dwie różne daty, Data zamówienia i Data dostawy, który zostanie użyty do określenia różnicy w dniach, miesiącach, latach, godzinach itp.

Aby sprawdzić liczbę dni między datą zamówienia a datą dostawy, część daty DAY jest przekazywana do DATEDIFF funkcja, po której następuje Data rozpoczęcia (OrderDate) i Data zakończenia (DeliveryDate) :

-- Define Order Date and Order Delivery Date
DECLARE @OrderDate DATETIME2='28 July 2018'
DECLARE @DeliveryDate DATETIME2='07 August 2018'

SELECT @OrderDate AS OrderDate,@DeliveryDate as DeliveryDate-- Show Order and Delivery Dates

-- Getting difference in days between order date and delivery date
SELECT DATEDIFF(DAY,@OrderDate,@DeliveryDate) as Days_Between_Order_and_Delivery

Przykład 3:Pobieranie godzin projektu (śledzenie czasu)

To interesujący przykład śledzenia czasu za pomocą funkcji DATEDIFF.

Na przykład interesuje nas, ile łącznie dni i dni w godzinach i dniach w minutach spędziliśmy nad konkretnym projektem, a następnie najpierw przekażemy część daty DAY do funkcji DATEDIFF, gdzie data początkowa to data rozpoczęcia projektu i data zakończenia to dzisiejsza data, po której następuje godzina, a następnie minuta w następujący sposób:

-- Define Project Start Date
DECLARE @ProjectStartDate DATETIME2='10 Nov 2018'


SELECT @ProjectStartDate AS ProjectStartDate-- Show Project Start Date

-- Getting Number of days spent on the project so far
SELECT DATEDIFF(DAY,@ProjectStartDate,GETDATE()) as Project_Days_So_Far
-- Getting Number of hours spent on the project so far
SELECT DATEDIFF(HOUR,@ProjectStartDate,GETDATE()) as Project_Hours_So_Far
-- Getting Number of minutes spent on the project so far
SELECT DATEDIFF(MINUTE,@ProjectStartDate,GETDATE()) as Project_Minutes_So_Far

Gratulacje, pomyślnie nauczyłeś się korzystać z funkcji T-SQL DATEADD, DATEDIFF i DATEPART.

Rzeczy do zrobienia

Teraz, gdy znasz już podstawowe funkcje dat, spróbuj wykonać poniższe czynności:

  1. Proszę zapoznać się z moim poprzednim artykułem Procedury raportów z testów jednostkowych – Przejdź do rozpoczęcia TDDD, część 4, aby skonfigurować przykładową bazę danych SQLDevBlogReportTDD, a następnie utwórz widok, aby sprawdzić liczbę miesięcy na podstawie daty rejestracji autora.
  2. Proszę zapoznać się z moim poprzednim artykułem Upraszczanie testów jednostkowych głównej procedury składowanej, która również wywołuje procedurę narzędziową, aby utworzyć przykładową bazę danych SQLBookShop i dodać Data dostawy kolumna do Zamówienie książki tabeli, a następnie utwórz nową procedurę składowaną ProcessOrder który używa DATEADD funkcja dodawania oczekiwanej dostawy pięć dni po dacie zamówienia.
  3. Zapraszam do zapoznania się z moim poprzednim artykułem Przejdź do rozpoczęcia tworzenia baz danych sterowanego testami (TDDD) — część 3 i spróbuj utworzyć raport dzienny za pomocą funkcji DATEADD T-SQL, modyfikując dane w przykładowej bazie danych SQLDevBlogReportTDD, tak aby w raporcie jest wystarczająca ilość danych.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zamawiać alfabetycznie w SQL

  2. Podłączanie aplikacji 64-bitowej do Acomba

  3. Niezamierzone skutki uboczne – sesje snu trzymające kłódki

  4. Operator SQL mniejszy lub równy (=) dla początkujących

  5. Usuwanie domyślnego śladu – część 1