Dieser Artikel konzentriert sich auf die Entwicklung eines grundlegenden Verständnisses für die Verwendung einer der gängigsten Transact-SQL-Datumsfunktionen:DATEADD, DATEDIFF und DATEPART.
In diesem Artikel habe ich auch betont, wie wichtig es ist, diese Datumsfunktionen bei täglichen Datumsmanipulationen richtig zu verwenden, gefolgt von einigen interessanten Szenarien, in denen diese Datumsfunktionen auf kollaborative Weise verwendet werden können, um etwas komplexe Datumsberechnungen zu lösen.
Da diese Funktionen hauptsächlich bei Datumsmanipulationen verwendet werden, versuchen wir zunächst zu verstehen, was wir unter Datumsmanipulation verstehen.
Datumsmanipulation verstehen
Die Datum-Uhrzeit-Werte müssen häufig je nach Anforderung geändert werden, und die Methode zum Ändern oder Handhaben oder Steuern der Datum-Uhrzeit-Berechnungen wird als Datumsmanipulation bezeichnet.
Wir beziehen uns auch auf diese Situation (Datumsmanipulation), wenn ein Datumswert aus einer Datenbank gelesen und dann geändert wird, bevor er erneut gespeichert wird.
Kundenauftragsszenario
Ein interessantes Beispiel für Datumsmanipulation ist eine Kundenbestellung Szenario, wenn eine Bestellung von einem Kunden platziert verarbeitet wird, das Lieferdatum muss 5 Tage vor dem Bestelldatum gesetzt werden , das bedeutet also, dass ein Entwickler T-SQL-Datumsfunktionen verwenden muss, um das Bestelldatum zu manipulieren (modifizieren). um das Lieferdatum zu berechnen .
Beispiel für einen täglichen Umsatzbericht
Ein etwas komplexes Beispiel ist, wenn ein Geschäftsanwender einen täglichen Umsatzbericht erstellt wenn es die Ergebnisse von gestern anzeigt.
Zum Beispiel, wenn wir den Daily Sales Report ausführen am Sonntag um 11:00 Uhr zeigt es uns Ergebnisse basierend auf Samstag, und wenn wir es am Samstag um 17:00 Uhr ausführen, zeigt es uns alle Ergebnisse am Freitag, weil der aktuelle Tag noch nicht vorbei ist und der letzte kompletter Tag verfügbar ist gestern. Auf diese Weise werden die meisten professionellen Tagesberichte, einschließlich Finanzberichte, erstellt.
In diesem Beispiel das aktuelle Datum wird manipuliert (geändert), um das vorherige Datum zu erhalten, das Verkaufsaufzeichnungen für einen ganzen Tag enthält.
Implementierung der Beispiele
Bitte denken Sie an die obigen Beispiele, da wir diese Szenarien implementieren werden, sobald wir ein gutes Verständnis für die Verwendung einiger der gängigsten Datumsfunktionen haben, die in diesem Artikel beschrieben werden.
Datumsfunktionen verstehen
Schauen wir uns zunächst einige grundlegende Datumsfunktionen an, die uns dabei helfen können, die Anforderungen zur Datumsmanipulation zu erfüllen, z Produktionsdatum und so weiter.
Da es keine festen Regeln gibt, beginnen wir zuerst mit der Erkundung der DATEPART-Funktion.
Verwendung der DATEPART-Funktion
Einfache Definition
Die DATEPART-Funktion wird verwendet, um einen Teil eines bestimmten Datums in einem numerischen Wert zurückzugeben.
Der Teil kann der Tag des Datums, der Monat des Datums, das Jahr des Datums usw. sein.
Beispielsweise können wir die DATEPART-Funktion verwenden, um den Tag eines bestimmten Datums abzurufen, um festzustellen, ob eine Bestellung am Sonntag aufgegeben wurde oder nicht.
Ein weiteres Beispiel ist, den Monat eines bestimmten Datums zur weiteren Verarbeitung an eine andere Datumsfunktion weiterzugeben.
Microsoft-Definition
Diese Funktion gibt eine Ganzzahl zurück, die den angegebenen datepart darstellt des angegebenen Datums .
Kompatibilität
Laut Microsoft-Dokumentation ist diese Funktion mit den folgenden SQL Server-Versionen kompatibel:
- SQL Server 2008 plus
- Azure SQL-Datenbank
- Azure SQL Data Warehouse
- Paralleles Data Warehouse
Syntax
DATEPART (Datumsteil , Datum)
Beispiel 1:Jahr als Teil des Datums erhalten
Lassen Sie uns auch ein bestimmtes Datum definieren (OrderDate ), um den gewünschten Teil (Tag, Monat, Jahr) mit der DATEPART-Funktion zu erhalten.
Um das Jahr des Bestelldatums zu erhalten, übergeben wir einfach YEAR gefolgt von Bestelldatum (@OrderDate) im DATEPART funktionieren wie folgt:
-- Bestelldatum definierenDECLARE @OrderDate DATETIME2='2017-01-11'-- Jahr des Bestelldatums abrufenSELECT DATEPART(YEAR,@OrderDate) as Year_OrderDate
Beispiel 2:Monatsteil erhalten
Wenn wir den Monat des Datums wissen möchten, dann Monat muss in den DATEPART übergeben werden funktionieren wie folgt:
-- Bestelldatum definierenDECLARE @OrderDate DATETIME2='2017-01-11'-- Monat des Bestelldatums abrufenSELECT DATEPART(MONTH,@OrderDate) as Month_OrderDate
Beispiel 3:Tagesteil erhalten
Um den Tagesteil des Datums zu finden, übergeben Sie einfach DAY in den DATEPART funktionieren wie folgt:
-- Bestelldatum definierenDECLARE @OrderDate DATETIME2='2017-01-11'-- Abrufen des Tages des BestelldatumsSELECT DATEPART(DAY,@OrderDate) as Day_OrderDate
Beispiel 4:Wochentagsteil erhalten
Um den Wochentagteil des Datums zu erhalten, übergeben Sie einfach WEEKDAY in den DATEPART funktionieren wie folgt:
-- Bestelldatum definierenDECLARE @OrderDate DATETIME2='2017-01-11'-- Wochentag des Bestelldatums abrufenSELECT DATEPART(WEEKDAY,@OrderDate) als WeekDay_OrderDate
Wir bekommen 4, was Mittwoch ist, beginnend mit Sonntag, was 1 ist.
Ebenso können wir auch einen Viertel-, Stunden-, Minuten-, Sekundenteil des Datums erhalten.
Kommen wir zur nächsten Datumsfunktion.
Verwendung der DATEADD-Funktion
Einfache Definition
Die Funktion DATEADD wird verwendet, um ein Datum zu addieren oder zu subtrahieren.
Zum Beispiel können wir herausfinden, welches Datum nach vier Tagen oder vier Tage vorher sein wird.
Dies ist sehr praktisch in Szenarien, in denen das erwartete Datum auf der Grundlage eines bestimmten Datums berechnet werden muss, z. B. muss das Ablaufdatum der Mitgliedschaft genau ein Jahr nach dem Registrierungsdatum liegen.
Ein weiteres Beispiel ist die Berechnung des Enddatums des Kurses, das genau zwei Monate nach dem Startdatum des Kurses liegen muss.
Microsoft-Definition
Diese Funktion fügt eine bestimmte Zahl hinzu value (als vorzeichenbehaftete Ganzzahl) zu einem bestimmten datepart eines eingegebenen Datums Wert und gibt dann diesen modifizierten Wert zurück.
Kompatibilität
Laut Microsoft-Dokumentation ist diese Funktion mit den folgenden SQL Server-Versionen kompatibel:
- SQL Server 2008 plus
- Azure SQL-Datenbank
- Azure SQL Data Warehouse
- Paralleles Data Warehouse
Syntax
DATEADD (Datumsteil, Zahl, Datum)
Datepart ist ein beliebiger Teil des Datums wie Tag, Monat, Jahr, Wochentag, Stunde usw.
Zahl ist dann Zahl des zu addierenden oder subtrahierenden Datumsteils (Tag, Monat, Jahr etc.)
Datum ist ein gegebenes Datum, das mit der Funktion DATEADD addiert oder subtrahiert werden muss
Beispiel 1:Datum des nächsten Jahres erhalten
Lassen Sie uns auch ein bestimmtes Datum (Registration Date) definieren, das mit DATEADD addiert oder subtrahiert wird Funktion nach Bedarf.
Das Datum des nächsten Jahres kann durch Hinzufügen von 1 zum Datumsteil des Jahres erhalten werden.
Um das nächste Jahr aus dem Registrierungsdatum zu erhalten, fügen wir einfach DatePart Year hinzu gefolgt von 1 gefolgt von Registrierungsdatum (@RegistrationDate) im DATEADD funktionieren wie folgt:
-- Registrierungsdatum definierenDECLARE @RegDate DATETIME2='2018-07-10'-- Nächstes Jahr vom Registrierungsdatum abrufenSELECT DATEADD(YEAR,1,@RegDate) als NextYear_RegDate
Beispiel 2:Datum des nächsten Monats erhalten
Um das Datum des nächsten Monats zu erhalten, übergeben Sie den MONAT datepart zum DATEADD Funktion, gefolgt von der Anzahl der Monate, die wir hinzufügen möchten, gefolgt von dem angegebenen Datum, das in unserem Fall das Registrierungsdatum (RegDate) ist.
-- Registrierungsdatum definierenDECLARE @RegDate DATETIME2='2018-07-10'SELECT @RegDate AS RegDate -- Registrierungsdatum anzeigen-- Den nächsten MONAT aus dem Registrierungsdatum abrufenSELECT DATEADD(MONTH,1,@RegDate) as NextMonth_RegDate
Beispiel 3:Abrufen des Datums am nächsten Tag
Wenn der Kurs am folgenden (nächsten) Tag der Anmeldung beginnt, müssen wir DAY bestehen mit 1 da der nächste Tag dem Registrierungsdatum einen weiteren Tag hinzufügt, was wie folgt demonstriert wird:
-- Registrierungsdatum definierenDECLARE @RegDate DATETIME2='2018-07-10'SELECT @RegDate AS RegDate -- Registrierungsdatum anzeigen-- Nächsten TAG vom Registrierungsdatum abrufenSELECT DATEADD(DAY,1,@RegDate) als NextDAY_RegDate
Beispiel 4:Einrichten des Tagesumsatzberichtsdatums
Konzentrieren wir uns nun auf ein etwas komplexes Szenario, das häufig bei der Entwicklung täglicher Finanzberichte verwendet wird.
Wenn wir einen täglichen Umsatzbericht erstellen möchten, sollte dieser die Daten von gestern anzeigen, da der aktuelle Tag noch nicht vollständig ist und der letzte vollständige Tag gestern ist, wie am Anfang dieses Artikels besprochen.
Am Ende müssen wir auch die gestrige Datumszeit in einen reinen Datumswert umwandeln, damit der Bericht den ganzen Tag abdecken kann.
Um das gestrige Datum basierend auf dem heutigen Datum zu erhalten, müssen wir „-1 Tag“ wie folgt zum aktuellen Datum hinzufügen:
-- Aktuelles Datum definierenDECLARE @CurrentDate DATETIME2=GETDATE()SELECT @CurrentDate AS CurrentDate -- Registrierungsdatum anzeigen-- Datum und Uhrzeit von gestern vom aktuellen Datum abrufenSELECT DATEADD(DAY,-1,@CurrentDate) as YesterdayDateTime_CurrentDate-- Konvertieren Yesterday DateTime into Date onlySELECT CAST(DATEADD(DAY,-1,@CurrentDate) AS DATE)as YesterdayDateOnly_CurrentDate
DATEDIFF-Funktion verwenden
Einfache Definition
Die DATEDIFF-Funktion wird verwendet, um die Differenz in Tagen, Monaten, Jahren, Stunden usw. zwischen zwei Daten zu ermitteln.
Beispielsweise können wir herausfinden, wie viele Tage zwischen zwei Daten vergangen sind.
Dies ist auch sehr praktisch in den Szenarien, in denen wir den Unterschied zwischen dem erwarteten Lieferdatum der Bestellung und dem tatsächlichen Lieferdatum der Bestellung untersuchen müssen.
Ein weiteres Beispiel ist die Zeiterfassung, d. h. zu verstehen, wie viele Stunden seit Beginn bis jetzt für ein bestimmtes Projekt aufgewendet wurden.
Microsoft-Definition
Diese Funktion gibt die Anzahl (als vorzeichenbehafteter ganzzahliger Wert) der angegebenen Datumsteilgrenzen zurück, die zwischen dem angegebenen Startdatum überschritten wurden und Enddatum .
Kompatibilität
Laut Microsoft-Dokumentation ist diese Funktion mit den folgenden SQL Server-Versionen kompatibel:
- SQL Server 2008 plus
- Azure SQL-Datenbank
- Azure SQL Data Warehouse
- Paralleles Data Warehouse
Syntax
DATEDIFF ( Datumsteil , Startdatum , Enddatum )Datepart ist ein beliebiger Teil des Datums wie Tag, Monat, Jahr, Wochentag, Stunde usw.
Beispiel 1:Unterschiede in Tagen verstehen
Versuchen wir zu verstehen, wie das DATEDIFF Funktion funktioniert.
Wenn wir versuchen, die Differenz in Tagen zwischen dem 1. Juli 2018 und dem 2. Juli 2018 herauszufinden, erhalten wir 1 Tag, was bedeutet, dass das Enddatum vom Startdatum abgezogen wird, um die Differenz zu erhalten:
SELECT DATEDIFF(DAY,'01 JULY 2018','02 JULY 2018') AS Days_Between_Two_Consecutive_DatesSELECT DATEDIFF(DAY,'01 JULY 2018','03 JULY 2018') AS Days_Between_01_July_03_July
Beispiel 2:Tage zwischen Bestellung und Lieferung
Lassen Sie uns zwei verschiedene Daten definieren, Bestelldatum und Lieferdatum die verwendet werden, um die Differenz in Tagen, Monaten, Jahren, Stunden usw. zu bestimmen.
Um die Anzahl der Tage zwischen dem Bestelldatum und dem Lieferdatum zu ermitteln, wird der Datumsteil DAY an das DATEDIFF übergeben Funktion gefolgt von Startdatum (Bestelldatum) und Enddatum (Lieferdatum) :
-- Bestelldatum und Lieferdatum der Bestellung definierenDECLARE @OrderDate DATETIME2='28 July 2018'DECLARE @DeliveryDate DATETIME2='07 August 2018'SELECT @OrderDate AS OrderDate,@DeliveryDate as DeliveryDate-- Bestell- und Lieferdatum anzeigen-- Differenz in Tagen zwischen Bestelldatum und Lieferdatum abrufenSELECT DATEDIFF(DAY,@OrderDate,@DeliveryDate) as Days_Between_Order_and_Delivery
Beispiel 3:Abrufen von Projektstunden (Zeiterfassung)
Dies ist ein interessantes Beispiel für die Zeiterfassung mit der DATEDIFF-Funktion.
Zum Beispiel möchten wir wissen, wie viele Tage und Tage in Stunden und Tage in Minuten wir insgesamt für ein bestimmtes Projekt aufgewendet haben, und dann werden wir zuerst den DAY-Datumsteil an die DATEDIFF-Funktion übergeben, wobei das Startdatum das ist Datum, an dem das Projekt begonnen hat, und das Enddatum ist das heutige Datum, gefolgt von HOUR und MINUTE wie folgt:
-- Startdatum des Projekts definierenDECLARE @ProjectStartDate DATETIME2='10 Nov 2018'SELECT @ProjectStartDate AS ProjectStartDate-- Startdatum des Projekts anzeigen-- Abrufen der Anzahl der Tage, die bisher für das Projekt aufgewendet wurdenSELECT DATEDIFF(DAY,@ProjectStartDate,GETDATE( )) als Project_Days_So_Far-- Abrufen der bisher für das Projekt aufgewendeten StundenSELECT DATEDIFF(HOUR,@ProjectStartDate,GETDATE()) as Project_Hours_So_Far-- Abrufen der bisher für das Projekt aufgewendeten MinutenSELECT DATEDIFF(MINUTE,@ProjectStartDate,GETDATE( )) als Project_Minutes_So_Far
Herzlichen Glückwunsch, Sie haben erfolgreich gelernt, die T-SQL-Funktionen DATEADD, DATEDIFF und DATEPART zu verwenden.
Dinge zu tun
Nachdem Sie nun mit einigen grundlegenden Datumsfunktionen vertraut sind, fordern Sie sich bitte selbst heraus, indem Sie die unten aufgeführten Dinge ausprobieren:
- Bitte lesen Sie meinen vorherigen Artikel Unit Testing Report Procedures – Jump to Start TDDD Part-4, um eine SQLDevBlogReportTDD-Beispieldatenbank einzurichten und dann eine Ansicht zu erstellen, um die Anzahl der Monate basierend auf dem Registrierungsdatum des Autors herauszufinden.
li>- Bitte lesen Sie meinen vorherigen Artikel Vereinfachen von Unit-Tests der gespeicherten Hauptprozedur, die auch eine Hilfsprozedur aufruft, um eine SQLBookShop-Beispieldatenbank zu erstellen und das DeliveryDate hinzuzufügen Spalte zur Buchbestellung -Tabelle und erstellen Sie dann eine neue gespeicherte Prozedur ProcessOrder die das DATEADD verwendet Funktion zum Hinzufügen der erwarteten Lieferung fünf Tage nach dem Bestelldatum.
- Bitte werfen Sie einen Blick auf meinen vorherigen Artikel Jump to Start Test-Driven Database Development (TDDD) – Part 3 und versuchen Sie, einen täglichen Bericht mit der DATEADD T-SQL-Funktion zu erstellen, indem Sie die Daten in der Beispieldatenbank SQLDevBlogReportTDD so ändern Es sind genügend Daten vorhanden, um im Bericht angezeigt zu werden.