sql >> Database teknologi >  >> RDS >> Database

Brug af DATEADD, DATEDIFF og DATEPART T-SQL-funktioner i simple termer

Denne artikel fokuserer på at udvikle en grundlæggende forståelse af, hvordan man bruger en af ​​de mest almindelige Transact-SQL-datofunktioner:DATEADD, DATEDIFF og DATEPART.

I denne artikel understregede jeg også vigtigheden af ​​korrekt at bruge disse datofunktioner i daglige datomanipulationer efterfulgt af nogle interessante scenarier, hvor disse datofunktioner kan bruges på en fælles måde til at løse lidt komplekse datoberegninger.

Da disse funktioner primært bruges i datomanipulationer, lad os først prøve at forstå, hvad vi mener med datomanipulation.

Forstå datomanipulation

Dato-tid-værdierne skal ofte ændres i henhold til kravet, og metoden til at ændre eller håndtere eller kontrollere dato-tid-beregningerne er kendt som datomanipulation.

Vi henviser også til denne situation (datomanipulation), når en datoværdi læses fra en database og derefter ændres, før den bliver gemt igen.

Customer-Ordre Scenario

Et interessant eksempel på datomanipulation er en kundeordre scenarie, når en ordre placeret af en kunde er behandlet, er leveringsdatoen skal indstilles 5 dage før bestillingsdatoen , så det betyder, at en udvikler skal bruge T-SQL-datofunktion(er) til at manipulere (ændre) ordre dato for at beregne leveringsdatoen .

Eksempel på daglig salgsrapport

Et lidt komplekst eksempel er, når en virksomhedsbruger kører en Daglig salgsrapport hvis det viser gårsdagens resultater.

For eksempel, hvis vi kører den Daglige salgsrapport søndag kl. 11.00, vil den vise os resultater baseret på lørdag, og hvis vi kører den lørdag kl. 17.00, vil den vise os alle resultater på fredag, fordi den aktuelle dag ikke er forbi endnu, og den seneste hele ledige dag er i går. Sådan er de fleste professionelle daglige rapporter inklusive økonomiske rapporter designet til at køre.

I dette eksempel er den aktuelle dato er manipuleret (modificeret) for at få den forrige dato, som indeholder salgsregistreringer for en hel dag.

Implementering af eksemplerne

Hold venligst ovenstående eksempler i tankerne, da vi skal implementere disse scenarier, når vi har fået en god forståelse for at bruge nogle af de mest almindelige datofunktioner beskrevet i denne artikel.

Forstå datofunktioner

Lad os først se på nogle grundlæggende datofunktioner, der kan hjælpe os med at opfylde kravene til datomanipulation, såsom at bestemme dage mellem to datoer (bestillingsdato og leveringsdato), at få sidste uges salgsregistreringer baseret på den aktuelle dato eller at beregne den forventede udløbsdato baseret på produktionsdato og så videre.

Da der ikke er nogen faste regler, begynder vi at udforske DATEPART-funktionen først.

Brug af DATEPART-funktionen

Simpel definition

DATEPART-funktionen bruges til at returnere en del af en given dato i en numerisk værdi.

Delen kan være dagen for datoen, måneden for datoen, årstal for datoen osv.

For eksempel kan vi bruge DATEPART-funktionen til at få dagen for en given dato for at bestemme, om en ordre blev afgivet om søndagen eller ej.

Et andet eksempel er at få måneden for en given dato videregivet til en anden datofunktion til videre behandling.

Microsoft Definition

Denne funktion returnerer et heltal, der repræsenterer den angivne datodel af den angivne dato .

Kompatibilitet

Ifølge Microsofts dokumentation er denne funktion kompatibel med følgende SQL Server-versioner:

  1. SQL Server 2008 plus
  2. Azure SQL-database
  3. Azure SQL Data Warehouse
  4. Parallel Data Warehouse

Syntaks

DATEPART (datopart , dato)

Eksempel 1:At få år en del af datoen

Lad os også definere en bestemt dato (Ordredato ) for at få den ønskede del (Dag, Måned, År) ved hjælp af DATEPART-funktionen.

For at få år for ordredatoen passerer vi simpelthen ÅR efterfulgt af Ordredato (@OrderDate) i DATEPART fungerer som følger:

-- Definer ordredatoDECLARE @OrderDate DATETIME2='2017-01-11'-- Henter år for ordredatoVÆLG DATEPART(YEAR,@OrderDate) som Year_OrderDate

Eksempel 2:Få månedsdel

Hvis vi er interesseret i at vide måneden for datoen, så Måned skal overføres til DATEPART fungerer som følger:

-- Definer ordredatoDECLARE @OrderDate DATETIME2='2017-01-11'-- Får måned for ordredatoVÆLG DATEPART(MONTH,@OrderDate) som Month_OrderDate

Eksempel 3:Få dagdel

For at finde Dag-delen af ​​datoen skal du blot bestå DAY ind i DATEPART fungerer som følger:

-- Definer ordredatoDECLARE @OrderDate DATETIME2='2017-01-11'-- Henter dag for ordredatoVÆLG DATEPART(DAY,@OrderDate) som Day_OrderDate

Eksempel 4:Få ugedag del

For at få ugedag-delen af ​​datoen skal du blot bestå WEEKDAY ind i DATEPART fungerer som følger:

-- Definer ordredatoDECLARE @OrderDate DATETIME2='2017-01-11'-- Får ugedag for ordredatoVÆLG DATEPART(WEEKDAY,@OrderDate) som WeekDay_OrderDate

Vi får 4, hvilket er onsdag fra søndag, som er 1.

På samme måde kan vi også få et kvarter, time, minut, anden del af datoen.

Lad os gå videre til næste datofunktion.

Brug af DATEADD-funktionen

Simpel definition

DATEADD-funktionen bruges til at tilføje eller trække en dato fra.

For eksempel kan vi finde ud af, hvad datoen bliver efter fire dage eller fire dage før.

Dette er meget praktisk i de scenarier, hvor den forventede dato skal beregnes baseret på en given dato, f.eks. medlemskabets udløbsdato skal være nøjagtigt et år fra registreringsdatoen.

Et andet eksempel er at beregne kursets slutdato, som skal være præcis to måneder efter kursets startdato.

Microsoft Definition

Denne funktion tilføjer et specificeret nummer værdi (som et signeret heltal) til en specificeret datodel af en input dato værdi, og returnerer derefter den ændrede værdi.

Kompatibilitet

Ifølge Microsofts dokumentation er denne funktion kompatibel med følgende SQL Server-versioner:

  1. SQL Server 2008 plus
  2. Azure SQL-database
  3. Azure SQL Data Warehouse
  4. Parallel Data Warehouse

Syntaks

DATEADD (datodel, nummer, dato)

Datepart er enhver del af datoen, såsom dag, måned, år, ugedag, time osv.

Tal er så nummeret på den datodel (dag, måned, år osv.), der skal tilføjes eller trækkes fra

Dato er en given dato, som skal tilføjes eller trækkes fra ved hjælp af DATEADD-funktionen

Eksempel 1:Få næste års dato

Lad os også definere en bestemt dato (registreringsdato), som skal tilføjes eller trækkes fra ved hjælp af DATEADD funktion baseret på kravene.

Den næste årsdato kan fås ved at tilføje 1 til Årsdatodelen.

For at få det næste år fra registreringsdatoen tilføjer vi blot DatePart År efterfulgt af 1 efterfulgt af Registreringsdato (@RegistrationDate) i DATEADD fungerer som følger:

-- Definer registreringsdatoDECLARE @RegDate DATETIME2='2018-07-10'-- Får næste år fra registreringsdatoVÆLG DATEADD(YEAR,1,@RegDate) som NextYear_RegDate

Eksempel 2:Dato for næste måned

For at få næste måneds dato skal du bestå MÅNEDEN datepart til DATEADD funktion efterfulgt af det antal måneder, vi ønsker at tilføje efterfulgt af den givne dato, som er registreringsdatoen (RegDate) i vores tilfælde.

-- Definer registreringsdatoDECLARE @RegDate DATETIME2='2018-07-10'SELECT @RegDate AS RegDate -- Vis registreringsdato-- Får næste MÅNED fra registreringsdatoen VÆLG DATEADD(MONTH,1,@RegDate) som NextMonth_RegDate /pre> 

Eksempel 3:Dato for næste dag

Hvis kurset begynder den følgende (næste) tilmeldingsdag, skal vi bestå DAG med 1 da den næste dag tilføjer endnu en dag til registreringsdatoen, hvilket demonstreres som følger:

-- Definer registreringsdatoDECLARE @RegDate DATETIME2='2018-07-10'SELECT @RegDate AS RegDate -- Vis registreringsdato-- Får næste DAG fra registreringsdato. Vælg DATEADD(DAY,1,@RegDate) som NextDAY_RegDate 

Eksempel 4:Opsætning af daglig salgsrapportdato

Lad os nu fokusere på et lidt komplekst scenarie, der ofte bruges i udviklingen af ​​daglige økonomiske rapporter.

Hvis vi vil oprette en daglig salgsrapport, skal den vise gårsdagens data, da den aktuelle dag endnu ikke er fuldført, og den seneste komplette dag er i går, som diskuteret i begyndelsen af ​​denne artikel.

I sidste ende er vi også nødt til at konvertere gårsdagens dato og klokkeslæt til kun datoværdi for at gøre det nemmere for rapporten at dække hele dagen.

For at få gårsdagens dato baseret på dagens dato, skal vi tilføje "-1 dag" til den aktuelle dato som følger:

-- Definer aktuel datoDECLARE @CurrentDate DATETIME2=GETDATE()SELECT @CurrentDate AS CurrentDate -- Vis registreringsdato-- Henter i går dato og klokkeslæt fra aktuel dato.VÆLG DATEADD(DAY,-1,@CurrentDate) som YesterdayDateTime_CurrentDate-- Konvertering I går DatoTid kun til datoVÆLG CAST(DATEADD(DAY,-1,@CurrentDate) AS DATE)som YesterdayDateOnly_CurrentDate

Brug af DATEDIFF-funktionen

Simpel definition

DATEDIFF-funktionen bruges til at bestemme forskellen i dage, måneder, år, timer osv. mellem to datoer.

For eksempel kan vi finde ud af, hvor mange dage der er gået mellem to datoer.

Dette er også meget praktisk i de scenarier, hvor vi skal undersøge forskellen mellem den forventede leveringsdato for ordren og den faktiske leveringsdato for ordren.

Et andet eksempel er tidsregistrering, hvilket betyder at forstå, hvor mange timer der er brugt på et bestemt projekt, siden det startede indtil nu.

Microsoft Definition

Denne funktion returnerer antallet (som en signeret heltalværdi) af de angivne datepart-grænser krydset mellem den angivne startdato og slutdato .

Kompatibilitet

Ifølge Microsofts dokumentation er denne funktion kompatibel med følgende SQL Server-versioner:

  1. SQL Server 2008 plus
  2. Azure SQL-database
  3. Azure SQL Data Warehouse
  4. Parallel Data Warehouse

Syntaks

DATEDIFF ( datopart , startdato , slutdato )

Datepart er enhver del af datoen, såsom dag, måned, år, ugedag, time osv.

Eksempel 1:Forstå forskellen i dage

Lad os prøve at forstå, hvordan DATEDIFF funktion virker.

Hvis vi forsøger at finde ud af forskellen i dage mellem 01. juli 2018 og 02. juli 2018, får vi 1 dag, hvilket betyder, at den trækker slutdatoen fra startdatoen for at få forskellen:

VÆLG DATODIFF(DAY,'01 JULI 2018','02 JULI 2018') AS Days_Between_Two_Consecutive_DatesSELECT DATEDIFF(DAY,'01 JULI 2018','03 JULI 2018') AS Days_0_3_Juween_0_BJuween_01BJuween Days. 

Eksempel 2:Få dage mellem ordre og levering

Lad os definere to forskellige datoer, Ordredato og Leveringsdato, som vil blive brugt til at bestemme forskellen i dage, måneder, år, timer osv.

For at finde ud af antallet af dage mellem ordredatoen og leveringsdatoen, overføres DAY-datodelen til DATEDIFF funktion efterfulgt af Startdato (OrderDate) og Slutdato (leveringsdato) :

-- Definer ordredato og ordreleveringsdatoDECLARE @OrderDate DATETIME2='28. juli 2018'DECLARE @DeliveryDate DATETIME2='07 August 2018'SELECT @OrderDate AS OrderDate,@DeliveryDate as DeliveryDate-- Vis ordre- og leveringsdatoer-- Får forskel i dage mellem ordredato og leveringsdato. VÆLG DATODIFF(DAY,@OrderDate,@DeliveryDate) som Days_Between_Order_and_Delivery

Eksempel 3:Få projekttimer (tidsregistrering)

Dette er et interessant eksempel på tidsregistrering ved hjælp af DATEDIFF-funktionen.

For eksempel er vi interesserede i at vide, hvor mange samlede dage og dage i timer og dage i minutter vi brugte på et bestemt projekt, og så skal vi først overføre DAY-datodelen til DATEDIFF-funktionen, hvor startdatoen er dato, hvor projektet begyndte, og slutdatoen er dagens dato efterfulgt af bestået HOUR og derefter passeret MINUTE som følger:

-- Definer projektstartdatoDECLARE @ProjectStartDate DATETIME2='10. nov. 2018'SELECT @ProjectStartDate AS ProjectStartDate-- Vis projektstartdato-- Får Antal dage brugt på projektet indtil videreSELECT DATEDIFF(DAY,@ProjectStartDate,GETDATE( )) som Project_Days_So_Far-- Får Antal timer brugt på projektet indtil nuSELECT DATEDIFF(HOUR,@ProjectStartDate,GETDATE()) som Project_Hours_So_Far-- Får Antal minutter brugt på projektet indtil nuSELECT DATEDIFF(MINUTE,@ProjectStartDate,GETDATE( )) som Project_Minutes_So_Far

Tillykke, du har med succes lært at bruge funktionerne DATEADD, DATEDIFF og DATEPART T-SQL.

Ting at gøre

Nu hvor du er bekendt med nogle grundlæggende datefunktioner, bedes du udfordre dig selv ved at prøve de ting, der er nævnt nedenfor:

  1. Se venligst min tidligere artikel Procedurer for enhedstestrapporter – Gå til start TDDD Part-4 for at opsætte et eksempel på SQLDevBlogReportTDD-database, og opret derefter en visning for at finde ud af antallet af måneder baseret på forfatterregistreringsdatoen.
  2. Se venligst min tidligere artikel Simplifying Unit Testing Main Stored Procedure, som også kalder en Utility Procedure for at oprette en eksempel SQLBookShop-database og tilføje DeliveryDate kolonnen til BookOrder tabel, og opret derefter en ny lagret procedure ProcessOrder som bruger DATEADD funktion for at tilføje forventet levering fem dage efter ordredatoen.
  3. Kig venligst på min tidligere artikel Gå til start testdrevet databaseudvikling (TDDD) – del 3, og prøv at oprette en daglig rapport ved hjælp af DATEADD T-SQL-funktionen ved at ændre dataene i prøvedatabasen SQLDevBlogReportTDD, så der er nok data til at blive vist i rapporten.

  1. Neo4j - Slet en node ved hjælp af Cypher

  2. mysql -> indsæt i tbl (vælg fra en anden tabel) og nogle standardværdier

  3. Python fra bunden:Opret et dynamisk websted

  4. SQL-ydeevne på LEFT OUTER JOIN vs. NOT EXISTS