sql >> Database >  >> RDS >> Database

DATEADD, DATEDIFF en DATEPART T-SQL-functies in eenvoudige bewoordingen gebruiken

Dit artikel is gericht op het ontwikkelen van een basiskennis van het gebruik van een van de meest voorkomende Transact-SQL-datumfuncties:DATEADD, DATEDIFF en DATEPART.

In dit artikel heb ik ook het belang benadrukt van het correct gebruiken van deze datumfuncties bij dagelijkse datummanipulaties, gevolgd door enkele interessante scenario's waarin deze datumfuncties op een gezamenlijke manier kunnen worden gebruikt om enigszins complexe datumberekeningen op te lossen.

Aangezien deze functies voornamelijk worden gebruikt bij datummanipulaties, laten we eerst proberen te begrijpen wat we bedoelen met datummanipulatie.

Datummanipulatie begrijpen

De datum-tijd-waarden moeten vaak worden aangepast volgens de vereisten, en de methode voor het wijzigen of verwerken of controleren van de datum-tijd-berekeningen staat bekend als datummanipulatie.

We verwijzen ook naar deze situatie (datummanipulatie) wanneer een datumwaarde uit een database wordt gelezen en vervolgens wordt gewijzigd voordat deze opnieuw wordt opgeslagen.

Klantbestellingscenario

Een interessant voorbeeld van datummanipulatie is een klantbestelling scenario, wanneer een bestelling geplaatst door een klant is verwerkt, de leverdatum moet 5 dagen voor de besteldatum worden ingesteld , dus dit betekent dat een ontwikkelaar T-SQL-datumfunctie(s) moet gebruiken om de besteldatum te manipuleren (wijzigen) om de leverdatum te berekenen .

Voorbeeld dagelijks verkooprapport

Een enigszins ingewikkeld voorbeeld is wanneer een zakelijke gebruiker een Dagelijks verkooprapport . maakt als het de resultaten van gisteren laat zien.

Als we bijvoorbeeld het Dagelijkse verkooprapport op zondag om 11:00 laat het ons resultaten zien op basis van zaterdag, en als we het op zaterdag om 17:00 laten zien, toont het ons alle resultaten op vrijdag, omdat de huidige dag nog niet voorbij is en de meest recente volledige beschikbare dag is gisteren. Dit is hoe de meeste professionele dagelijkse rapporten, inclusief financiële rapporten, moeten worden uitgevoerd.

In dit voorbeeld is de huidige datum wordt gemanipuleerd (aangepast) om de vorige datum te krijgen, die verkooprecords voor een volledige dag bevat.

De voorbeelden implementeren

Houd de bovenstaande voorbeelden in gedachten, aangezien we deze scenario's gaan implementeren zodra we een goed begrip hebben van het gebruik van enkele van de meest voorkomende datumfuncties die in dit artikel worden beschreven.

Datumfuncties begrijpen

Laten we eerst kijken naar enkele basisdatumfuncties die ons kunnen helpen te voldoen aan de vereisten voor datummanipulatie, zoals het bepalen van dagen tussen twee datums (besteldatum en leveringsdatum), het verkrijgen van de verkooprecords van vorige week op basis van de huidige datum of het berekenen van de verwachte vervaldatum op basis van de productiedatum enzovoort.

Aangezien er geen vaste regels zijn, beginnen we eerst de DATEPART-functie te verkennen.

De DATEPART-functie gebruiken

Eenvoudige definitie

De functie DATEPART wordt gebruikt om een ​​deel van een bepaalde datum in een numerieke waarde terug te geven.

Het deel kan de dag van de datum, de maand van de datum, het jaar van de datum enz. zijn.

We kunnen bijvoorbeeld de DATEPART-functie gebruiken om de dag van een bepaalde datum te krijgen om te bepalen of een bestelling op zondag is geplaatst of niet.

Een ander voorbeeld is om de maand van een bepaalde datum door te geven aan een andere datumfunctie voor verdere verwerking.

Microsoft-definitie

Deze functie retourneert een geheel getal dat het opgegeven datepart vertegenwoordigt van de opgegeven datum .

Compatibiliteit

Volgens Microsoft-documentatie is deze functie compatibel met de volgende SQL Server-versies:

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

Syntaxis

DATEPART (datepart , date)

Voorbeeld 1:Jaar een deel van de datum krijgen

Laten we ook een bepaalde datum definiëren (OrderDate ) om het gewenste deel (dag, maand, jaar) te krijgen met behulp van de DATEPART-functie.

Om het jaar van de besteldatum te krijgen, passeren we eenvoudig JAAR gevolgd door Orderdatum (@OrderDate) in de DATEPART functioneren als volgt:

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

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

Voorbeeld 2:Maandgedeelte krijgen

Als we de maand van de datum willen weten, dan Maand moet worden doorgegeven aan de DATEPART functioneren als volgt:

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

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

Voorbeeld 3:Dagdeel halen

Om het daggedeelte van de datum te vinden, gaat u gewoon door DAY in de DATEPART functioneren als volgt:

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

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

Voorbeeld 4:Een weekdagdeel krijgen

Om het weekdag-gedeelte van de datum te krijgen, gaat u gewoon door WEEKDAY in de DATEPART functioneren als volgt:

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

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

We krijgen 4, dat is woensdag vanaf zondag, dat is 1.

Op dezelfde manier kunnen we ook een Kwartier, Uur, Minuut, Tweede deel van de datum krijgen.

Laten we verder gaan met de volgende datumfunctie.

De DATEADD-functie gebruiken

Eenvoudige definitie

De DATEADD-functie wordt gebruikt om een ​​datum op te tellen of af te trekken.

We kunnen bijvoorbeeld na vier dagen of vier dagen ervoor te weten komen wat de datum zal zijn.

Dit is erg handig in de scenario's waarin de verwachte datum moet worden berekend op basis van een bepaalde datum, zoals de vervaldatum van het lidmaatschap precies één jaar vanaf de registratiedatum.

Een ander voorbeeld is het berekenen van de einddatum van de cursus, die precies twee maanden na de begindatum van de cursus moet zijn.

Microsoft-definitie

Deze functie voegt een gespecificeerd nummer toe waarde (als een geheel getal met teken) naar een gespecificeerd datepart van een ingevoerde datum waarde, en retourneert vervolgens die gewijzigde waarde.

Compatibiliteit

Volgens Microsoft-documentatie is deze functie compatibel met de volgende SQL Server-versies:

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

Syntaxis

DATEADD (datepart, number, date)

Datepart is een deel van de datum, zoals dag, maand, jaar, weekdag, uur enz.

Getal is dan het nummer van het datumdeel (dag, maand, jaar etc.) dat moet worden opgeteld of afgetrokken

Datum is een bepaalde datum die moet worden opgeteld of afgetrokken met behulp van de DATEADD-functie

Voorbeeld 1:de datum van volgend jaar halen

Laten we ook een bepaalde datum (registratiedatum) definiëren die zal worden opgeteld of afgetrokken met behulp van de DATEADD functie op basis van de vereisten.

De volgende jaardatum kan worden verkregen door 1 toe te voegen aan het jaardatumgedeelte.

Om het volgende jaar vanaf de registratiedatum te krijgen, voegen we eenvoudig DatePart Year . toe gevolgd door 1 gevolgd door Registratiedatum (@RegistrationDate) in de DATEADD functioneren als volgt:

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

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

Voorbeeld 2:Datum volgende maand ophalen

Om de datum van de volgende maand te krijgen, passeert u de MAAND datepart naar de DATEADD functie gevolgd door het aantal maanden dat we willen toevoegen, gevolgd door de opgegeven datum, in ons geval de registratiedatum (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

Voorbeeld 3:De volgende dag datum ophalen

Als de cursus begint op de volgende (volgende) dag van registratie, moeten we DAY slagen met 1 sinds de volgende dag voegt een dag toe aan de registratiedatum, wat als volgt wordt aangetoond:

-- 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

Voorbeeld 4:Datum van dagelijkse verkooprapportage instellen

Laten we ons nu concentreren op een enigszins complex scenario dat vaak wordt gebruikt bij de ontwikkeling van dagelijkse financiële rapporten.

Als we een dagelijks verkooprapport willen maken, moeten de gegevens van gisteren worden weergegeven, aangezien de huidige dag nog niet is voltooid en de meest recente volledige dag gisteren is, zoals besproken aan het begin van dit artikel.

Uiteindelijk moeten we ook de datum-tijd van gisteren omzetten in alleen-datum, zodat het rapport gemakkelijker de hele dag kan bestrijken.

Om de datum van gisteren te krijgen op basis van de datum van vandaag, moeten we als volgt "-1 dag" toevoegen aan de huidige datum:

-- 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

De DATEDIFF-functie gebruiken

Eenvoudige definitie

De DATEDIFF-functie wordt gebruikt om het verschil in dagen, maanden, jaren, uren enz. tussen twee datums te bepalen.

We kunnen bijvoorbeeld achterhalen hoeveel dagen er zijn verstreken tussen twee datums.

Dit is ook erg handig in de scenario's waarin we het verschil tussen de verwachte leveringsdatum van de bestelling en de werkelijke leveringsdatum van de bestelling moeten onderzoeken.

Een ander voorbeeld is tijdregistratie, wat betekent dat je moet begrijpen hoeveel uur er aan een bepaald project is besteed sinds het tot nu toe is begonnen.

Microsoft-definitie

Deze functie retourneert het aantal (als een geheel getal met teken) van de gespecificeerde datumdeelgrenzen die zijn overschreden tussen de gespecificeerde startdatum en einddatum .

Compatibiliteit

Volgens Microsoft-documentatie is deze functie compatibel met de volgende SQL Server-versies:

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

Syntaxis

DATEDIFF ( datepart , startdate , enddate )

Datepart is een deel van de datum, zoals dag, maand, jaar, weekdag, uur enz.

Voorbeeld 1:Verschil in dagen begrijpen

Laten we proberen te begrijpen hoe de DATEDIFF functie werkt.

Als we proberen het verschil in dagen tussen 01 juli 2018 en 02 juli 2018 te achterhalen, krijgen we 1 dag, wat betekent dat de einddatum wordt afgetrokken van de startdatum om het verschil te krijgen:

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

Voorbeeld 2:Dagen tussen bestelling en levering

Laten we twee verschillende datums definiëren, Besteldatum en Bezorgdatum, die zal worden gebruikt om het verschil in dagen, maanden, jaren, uren enz. te bepalen.

Om het aantal dagen tussen de besteldatum en de leveringsdatum te weten te komen, wordt het DAG datepart doorgegeven aan de DATEDIFF functie gevolgd door Startdatum (OrderDate) en Einddatum (Leveringsdatum) :

-- 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

Voorbeeld 3:Projecturen verkrijgen (Time Tracking)

Dit is een interessant voorbeeld van tijdregistratie met behulp van de DATEDIFF-functie.

We zijn bijvoorbeeld geïnteresseerd om te weten hoeveel totale dagen en dagen in uren en dagen in minuten we aan een bepaald project hebben besteed, en dan gaan we eerst het DAG-datumgedeelte doorgeven aan de DATEDIFF-functie, waarbij de startdatum de datum waarop het project begon en de einddatum is de datum van vandaag, gevolgd door HOUR en vervolgens MINUTE als volgt:

-- 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

Gefeliciteerd, u hebt met succes de functies DATEADD, DATEDIFF en DATEPART T-SQL leren gebruiken.

Dingen om te doen

Nu u bekend bent met enkele basisdatumfuncties, kunt u uzelf uitdagen door de onderstaande dingen te proberen:

  1. Raadpleeg mijn vorige artikel Procedures voor het testen van eenheden – Ga naar Start TDDD Part-4 om een ​​voorbeeld SQLDevBlogReportTDD-database in te stellen en maak vervolgens een weergave om het aantal maanden te achterhalen op basis van de registratiedatum van de auteur.
  2. li>
  3. Raadpleeg mijn vorige artikel Vereenvoudiging van de hoofdopgeslagen procedure voor het testen van eenheden, die ook een hulpprogramma-procedure aanroept om een ​​voorbeeld-SQLBookShop-database te maken en de DeliveryDate toe te voegen kolom naar de BookOrder tabel en maak vervolgens een nieuwe opgeslagen procedure ProcessOrder die de DATEADD . gebruikt functie om de verwachte levering vijf dagen na de besteldatum toe te voegen.
  4. Bekijk mijn vorige artikel Jump to Start Test-Driven Database Development (TDDD) – Part 3 en probeer een dagelijks rapport te maken met behulp van de DATEADD T-SQL-functie door de gegevens in de SQLDevBlogReportTDD-voorbeelddatabase aan te passen zodat er zijn voldoende gegevens om in het rapport weer te geven.

  1. Is er een ernstige prestatiehit voor het gebruik van buitenlandse sleutels in SQL Server?

  2. Over het RM-formaatelement in Oracle

  3. Een CSV importeren naar MySQL met een ander datumformaat

  4. Een verhaal van twee clusterfactoren