Den här artikeln fokuserar på att utveckla en grundläggande förståelse för hur man använder en av de vanligaste Transact-SQL-datumfunktionerna:DATEADD, DATEDIFF och DATEPART.
I den här artikeln betonade jag också vikten av att använda dessa datumfunktioner korrekt i dagliga datummanipulationer följt av några intressanta scenarier där dessa datumfunktioner kan användas på ett samarbetssätt för att lösa lite komplexa datumberäkningar.
Eftersom dessa funktioner främst används i datummanipulationer, låt oss först försöka förstå vad vi menar med datummanipulation.
Förstå datummanipulation
Datum-tid-värdena måste ofta modifieras enligt kraven, och metoden för att modifiera eller hantera eller kontrollera datum-tid-beräkningarna är känd som datummanipulation.
Vi hänvisar också till denna situation (datummanipulation) när ett datumvärde läses från en databas och sedan modifieras innan det lagras igen.
Scenario för kundorder
Ett intressant exempel på datummanipulation är en kundorder scenario, när en beställning placerad av en kund bearbetas, leveransdatumet måste ställas in 5 dagar före beställningsdatumet , så detta betyder att en utvecklare måste använda T-SQL-datumfunktion(er) för att manipulera (modifiera) orderdatumet för att beräkna leveransdatum .
Exempel på daglig försäljningsrapport
Ett lite komplicerat exempel är när en företagsanvändare kör en Daglig försäljningsrapport om det visar gårdagens resultat.
Om vi till exempel kör Dagliga försäljningsrapporten på söndag kl. 11.00 visar den oss resultat baserat på lördag, och om vi kör den på lördag kl. 17.00 visar den oss alla resultat på fredag, eftersom den aktuella dagen inte är över än och den senaste hela lediga dagen är igår. Det är så de flesta professionella dagliga rapporter inklusive finansiella rapporter är utformade för att köras.
I det här exemplet är aktuellt datum manipuleras (modifieras) för att få föregående datum, som innehåller försäljningsposter för en hel dag.
Implementera exemplen
Vänligen tänk på ovanstående exempel eftersom vi kommer att implementera dessa scenarier när vi har fått en god förståelse för att använda några av de vanligaste datumfunktionerna som beskrivs i den här artikeln.
Förstå datumfunktioner
Låt oss först titta på några grundläggande datumfunktioner som kan hjälpa oss att uppfylla kraven för datummanipulation, som att bestämma dagar mellan två datum (beställningsdatum och leveransdatum), få förra veckans försäljningsposter baserat på aktuellt datum eller beräkna det förväntade utgångsdatumet baserat på produktionsdatum och så vidare.
Eftersom det inte finns några hårda och snabba regler börjar vi utforska DATEPART-funktionen först.
Använda DATEPART-funktionen
Enkel definition
DATEPART-funktionen används för att returnera en del av ett givet datum i ett numeriskt värde.
Delen kan vara dagen för datumet, månaden för datumet, år för datumet etc.
Till exempel kan vi använda DATEPART-funktionen för att få dagen för ett givet datum för att avgöra om en beställning gjordes på söndagen eller inte.
Ett annat exempel är att få månaden för ett givet datum att överföras till en annan datumfunktion för vidare bearbetning.
Microsoft Definition
Denna funktion returnerar ett heltal som representerar den angivna datumdelen av det angivna datumet .
Kompatibilitet
Enligt Microsofts dokumentation är den här funktionen kompatibel med följande SQL Server-versioner:
- SQL Server 2008 plus
- Azure SQL Database
- Azure SQL Data Warehouse
- Parallell Data Warehouse
Syntax
DATEPART (datepart , date)
Exempel 1:Att få år en del av datumet
Låt oss också definiera ett visst datum (OrderDate ) för att få önskad del (Dag, Månad, År) med hjälp av DATEPART-funktionen.
För att få år för beställningsdatum passerar vi helt enkelt ÅR följt av Beställningsdatum (@OrderDate) i DATEPART fungerar enligt följande:
-- Definiera beställningsdatumDECLARE @OrderDate DATETIME2='2017-01-11'-- Får år för beställningsdatumVÄLJ DATUMDEL(YEAR,@OrderDate) som Year_OrderDate
Exempel 2:Få månadsdel
Om vi är intresserade av att veta månaden för datumet, Månad måste skickas in i DATEPART fungerar enligt följande:
-- Definiera beställningsdatumDECLARE @OrderDate DATETIME2='2017-01-11'-- Hämta månad för beställningsdatumVÄLJ DATUMDEL(MONTH,@OrderDate) som Month_OrderDate
Exempel 3:Få dagdel
För att hitta dagdelen av datumet passerar du bara DAG till DATEPART fungerar enligt följande:
-- Definiera beställningsdatumDECLARE @OrderDate DATETIME2='2017-01-11'-- Hämta dag för beställningsdatumVÄLJ DATUMDEL(DAY,@OrderDate) som Day_OrderDate
Exempel 4:Få veckodag del
För att få veckodagens del av datumet passerar du bara WEEKDAY till DATEPART fungerar enligt följande:
-- Definiera beställningsdatumDECLARE @OrderDate DATETIME2='2017-01-11'-- Hämtar veckodag för beställningsdatumVÄLJ DATUMDEL(WEEKDAY,@OrderDate) som WeekDay_OrderDate
Vi får 4, vilket är onsdag från och med söndag, vilket är 1.
På samma sätt kan vi också få en kvart, timme, minut, andra del av datumet.
Låt oss gå vidare till nästa datumfunktion.
Använda DATEADD-funktionen
Enkel definition
Funktionen DATEADD används för att lägga till eller subtrahera ett datum.
Vi kan till exempel ta reda på vad datumet blir efter fyra dagar eller fyra dagar innan.
Detta är mycket praktiskt i de scenarier där det förväntade datumet måste beräknas baserat på ett givet datum, t.ex. medlemskapets utgångsdatum måste vara exakt ett år från registreringsdatumet.
Ett annat exempel är att beräkna kursens slutdatum som måste vara exakt två månader efter kursens startdatum.
Microsoft Definition
Den här funktionen lägger till ett specificerat nummer värde (som ett signerat heltal) till en angiven datumdel av ett inmatat datum värde och returnerar sedan det ändrade värdet.
Kompatibilitet
Enligt Microsofts dokumentation är den här funktionen kompatibel med följande SQL Server-versioner:
- SQL Server 2008 plus
- Azure SQL Database
- Azure SQL Data Warehouse
- Parallell Data Warehouse
Syntax
DATEADD (datumdel, nummer, datum)
Datumdel är vilken del av datumet som helst som dag, månad, år, veckodag, timme etc.
Number är då numret på datumdelen (dag, månad, år etc.) som ska adderas eller subtraheras
Datum är ett givet datum som måste läggas till eller subtraheras med funktionen DATEADD
Exempel 1:Få nästa års datum
Låt oss också definiera ett visst datum (registreringsdatum) som kommer att läggas till eller subtraheras med DATEADD funktion baserat på kraven.
Nästa årsdatum kan erhållas genom att lägga till 1 till datumdelen År.
För att få nästa år från registreringsdatumet lägger vi helt enkelt till DatePart År följt av 1 följt av Registreringsdatum (@RegistrationDate) i DATEADD fungerar enligt följande:
-- Definiera registreringsdatumDECLARE @RegDate DATETIME2='2018-07-10'-- Får nästa år från registreringsdatumVÄLJ DATEADD(YEAR,1,@RegDate) som NextYear_RegDate
Exempel 2:Få nästa månads datum
För att få nästa månadsdatum, passera MÅNADEN datepart till DATEADD funktion följt av antalet månader vi vill lägga till följt av det givna datumet som är registreringsdatumet (RegDate) i vårt fall.
-- Definiera registreringsdatumDECLARE @RegDate DATETIME2='2018-07-10'SELECT @RegDate AS RegDate -- Visa registreringsdatum-- Får nästa MÅNAD från registreringsdatumet VÄLJ DATEADD(MONTH,1,@RegDate) som NextMonth_RegDate /pre>
Exempel 3:Få nästa dagsdag
Om kursen börjar följande (nästa) registreringsdag måste vi klara DAG med 1 eftersom nästa dag lägger till ytterligare en dag till registreringsdatumet, vilket visas på följande sätt:
-- Definiera registreringsdatumDECLARE @RegDate DATETIME2='2018-07-10'SELECT @RegDate AS RegDate -- Visa registreringsdatum-- Får nästa DAG från registreringsdatum. före>
Exempel 4:Ställa in datum för daglig försäljningsrapport
Låt oss nu fokusera på ett lite komplext scenario som ofta används i utvecklingen av dagliga finansiella rapporter.
Om vi vill skapa en daglig försäljningsrapport bör den visa gårdagens data, eftersom den aktuella dagen ännu inte är klar och den senaste fullständiga dagen är igår som diskuterades i början av den här artikeln.
I slutändan måste vi också konvertera gårdagens datum och tid till endast datum för att göra det lättare för rapporten att täcka hela dagen.
För att få gårdagens datum baserat på dagens datum måste vi lägga till "-1 dag" till det aktuella datumet enligt följande:
-- Definiera aktuellt datumDECLARE @CurrentDate DATETIME2=GETDATE()SELECT @CurrentDate AS CurrentDate -- Visa registreringsdatum-- Hämta gårdagens datum och tid från aktuellt datumVÄLJ DATEADD(DAY,-1,@CurrentDate) som YesterdayDateTime_CurrentDate-- Igår DatumTid till endast datumVÄLJ CAST(DATEADD(DAY,-1,@CurrentDate) AS DATE)som YesterdayDateOnly_CurrentDate
Använda DATEDIFF-funktionen
Enkel definition
DATEDIFF-funktionen används för att bestämma skillnaden i dagar, månader, år, timmar etc. mellan två datum.
Vi kan till exempel ta reda på hur många dagar som har gått mellan två datum.
Detta är också mycket praktiskt i de scenarier där vi behöver undersöka skillnaden mellan det förväntade leveransdatumet för beställningen och det faktiska leveransdatumet för beställningen.
Ett annat exempel är tidsspårning, vilket innebär att förstå hur många timmar som har lagts ner på ett visst projekt sedan det startade fram till nu.
Microsoft Definition
Denna funktion returnerar antalet (som ett signerat heltalsvärde) för de angivna datumdelens gränser som korsas mellan det angivna startdatumet och slutdatum .
Kompatibilitet
Enligt Microsofts dokumentation är den här funktionen kompatibel med följande SQL Server-versioner:
- SQL Server 2008 plus
- Azure SQL Database
- Azure SQL Data Warehouse
- Parallell Data Warehouse
Syntax
DATEDIFF ( datepart , startdate , slutdatum )Datumdel är vilken del av datumet som helst som dag, månad, år, veckodag, timme etc.
Exempel 1:Förstå skillnaden i dagar
Låt oss försöka förstå hur DATEDIFF funktionen fungerar.
Om vi försöker ta reda på skillnaden i dagar mellan 1 juli 2018 och 2 juli 2018 får vi 1 dag, vilket innebär att det subtraherar slutdatumet från startdatumet för att få skillnaden:
VÄLJ DATUMDIFF(DAY,'01 JULI 2018','02 JULY 2018') AS Days_Between_Two_Consecutive_DatesVÄLJ DATUMDIFF(DAY,'01 JULI 2018','03 JULI 2018') AS Days_0_BJuween_0_BJuween_0_BJuween Days
Exempel 2:Att få dagar mellan beställning och leverans
Låt oss definiera två olika datum, Beställningsdatum och Leveransdatum, som kommer att användas för att bestämma skillnaden i dagar, månader, år, timmar etc.
För att ta reda på antalet dagar mellan beställningsdatum och leveransdatum överförs DAY-datumdelen till DATEDIFF funktion följt av Startdatum (OrderDate) och Slutdatum (leveransdatum) :
-- Definiera orderdatum och orderleveransdatumDECLARE @OrderDate DATETIME2='28 juli 2018'DECLARE @DeliveryDate DATETIME2='07 augusti 2018'SELECT @OrderDate AS OrderDate,@DeliveryDate as DeliveryDate-- Visa order- och leveransdatum-- Får skillnad i dagar mellan beställningsdatum och leveransdatum VÄLJ DATUMDIFF(DAY,@OrderDate,@DeliveryDate) som Days_Between_Order_and_Delivery
Exempel 3:Få projekttimmar (tidsspårning)
Detta är ett intressant exempel på tidsspårning med DATEDIFF-funktionen.
Till exempel är vi intresserade av att veta hur många sammanlagda dagar och dagar i timmar och dagar i minuter vi spenderade på ett visst projekt, och sedan ska vi först överföra DAY-datumdelen till DATEDIFF-funktionen, där startdatumet är datum då projektet började och slutdatumet är dagens datum följt av att HOUR och sedan passerar MINUTE enligt följande:
-- Definiera projektets startdatumDECLARE @ProjectStartDate DATETIME2='10 nov 2018'SELECT @ProjectStartDate AS ProjectStartDate-- Visa projektets startdatum-- Får antalet dagar som spenderats på projektet hittills VÄLJ DATUMDIFF(DAY,@ProjectStartDate,GETDATE( )) som Project_Days_So_Far-- Får antalet timmar som spenderats på projektet hittillsVÄLJ DATUMDIFF(HOUR,@ProjectStartDate,GETDATE()) som Project_Hours_So_Far-- Får antalet minuter som spenderats på projektet hittillsVÄLJ DATUMDIFF(MINUTE,@ProjectStartDate,GETDATE( )) som Project_Minutes_So_Far
Grattis, du har framgångsrikt lärt dig att använda funktionerna DATEADD, DATEDIFF och DATEPART T-SQL.
Saker att göra
Nu när du är bekant med några grundläggande datumfunktioner, utmana dig själv genom att prova saker som nämns nedan:
- Se min tidigare artikel Rapportprocedurer för enhetstestning – Hoppa till Start TDDD Del-4 för att ställa in ett exempel på SQLDevBlogReportTDD-databas, och skapa sedan en vy för att ta reda på antalet månader baserat på författarens registreringsdatum.
- Se min tidigare artikel Förenkla enhetstestning Main Stored Procedure som också anropar en Utility Procedur för att skapa ett exempel på SQLBookShop-databas och lägga till DeliveryDate kolumnen till BookOrder tabell och skapa sedan en ny lagrad procedur ProcessOrder som använder DATEADD funktion för att lägga till förväntad leverans fem dagar efter beställningsdatumet.
- Ta en titt på min tidigare artikel Hoppa till Start Testdriven Database Development (TDDD) – Del 3 och försök skapa en daglig rapport med DATEADD T-SQL-funktionen genom att modifiera data i exempeldatabasen SQLDevBlogReportTDD så att det finns tillräckligt med data för att visas i rapporten.