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:
- SQL Server 2008 plus
- Baza danych Azure SQL
- Azure SQL Data Warehouse
- 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:
- SQL Server 2008 plus
- Baza danych Azure SQL
- Azure SQL Data Warehouse
- 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:
- SQL Server 2008 plus
- Baza danych Azure SQL
- Azure SQL Data Warehouse
- 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:
- 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.
- 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.
- 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.