DATE_BUCKET (Transact-SQL)

Gilt für: SQL Server 2022 (16.x) Azure SQL-DatenbankAzure SQL Managed Instance Azure SQL Edge

Diese Funktion gibt den datetime-Wert zurück, der dem Anfang jedes datetime-Buckets entspricht, beginnend beim Zeitstempel, der vom origin-Parameter definiert wird, oder den origin-Wert von 1900-01-01 00:00:00.000, wenn der origin-Parameter nicht angegeben ist.

Eine Übersicht über alle Datums- und Uhrzeitdatentypen und zugehörigen Funktionen für Transact-SQL finden Sie unter Datums- und Uhrzeitdatentypen und zugehörige Funktionen (Transact-SQL).

Transact-SQL-Syntaxkonventionen

Syntax

DATE_BUCKET (datepart, number, date [, origin ] )

Argumente

datepart

Der Teil von date, der mit dem number-Parameter verwendet wird, z. B. Jahr, Monat, Tag, Minute, Sekunde.

DATE_BUCKET akzeptiert für die datepart-Argumente keine benutzerdefinierten Variablenentsprechungen.

datepart Abkürzungen
day dd, d
week wk, ww
month mm, m
quarter qq, q
year yy, yyyy
hour hh
minute mi, n
second ss, s
millisecond ms

Zahl

Der Integerwert, der die Breite des Buckets in Kombination mit dem datepart-Argument bestimmt. Dies stellt die Breite des datepart-Buckets ab der Ursprungszeit dar. Dieses Argument kann kein negativer ganzzahliger Wert sein.

date

Ein Ausdruck, der in einen der folgenden Werte aufgelöst werden kann:

  • date
  • datetime
  • datetime2
  • datetimeoffset
  • smalldatetime
  • time

Für date akzeptiert DATE_BUCKET einen Spaltenausdruck, einen Ausdruck oder eine benutzerdefinierte Variable, wenn diese in einen der oben genannten Datentypen aufgelöst werden.

origin

Ein optionaler Ausdruck, der in einen der folgenden Werte aufgelöst werden kann:

  • date
  • datetime
  • datetime2
  • datetimeoffset
  • smalldatetime
  • time

Der Datentyp für origin sollte mit dem Datentyp des date-Parameters übereinstimmen.

DATE_BUCKET verwendet einen origin-Standardwert für „date“ von 1900-01-01 00:00:00.000, d. h. 12:00 Uhr am Montag, 1. Januar 1900, wenn für die Funktion kein origin-Wert angegeben ist.

Rückgabetyp

Der Datentyp des Rückgabewerts für diese Methode ist dynamisch. Der Rückgabetyp hängt von dem Argument ab, das für date angegeben wird. Wenn für date ein gültiger Eingabedatentyp angegeben wird, gibt DATE_BUCKET denselben Datentyp zurück. DATE_BUCKET löst einen Fehler aus, wenn für den date-Parameter ein Zeichenfolgenliteral angegeben wird.

Rückgabewerte

Grundlegendes zur Ausgabe von DATE_BUCKET

DATE_BUCKET gibt den aktuellsten Datums- oder Uhrzeitwert zurück, der dem datepart- und dem number-Parameter entspricht. In den folgenden Ausdrücken gibt DATE_BUCKET z. B. den Ausgabewert 2020-04-13 00:00:00.0000000 zurück, da die Ausgabe basierend auf einwöchigen Buckets aus der Standardursprungszeit von 1900-01-01 00:00:00.000 berechnet wird. Der Wert 2020-04-13 00:00:00.0000000 ist 6.276 Wochen vom Ursprungswert 1900-01-01 00:00:00.000 entfernt.

DECLARE @date DATETIME2 = '2020-04-15 21:22:11';
SELECT DATE_BUCKET(WEEK, 1, @date);

Für alle folgenden Ausdrücke wird der gleiche Ausgabewert von 2020-04-13 00:00:00.0000000 zurückgegeben. Dies liegt daran, dass 2020-04-13 00:00:00.0000000 6.276 Wochen vom origin-Wert entfernt und 6.276 durch 2, 3, 4 und 6 teilbar ist.

DECLARE @date DATETIME2 = '2020-04-15 21:22:11';
SELECT DATE_BUCKET(WEEK, 2, @date);
SELECT DATE_BUCKET(WEEK, 3, @date);
SELECT DATE_BUCKET(WEEK, 4, @date);
SELECT DATE_BUCKET(WEEK, 6, @date);

Die Ausgabe für den unten angegebenen Ausdruck ist 2020-04-06 00:00:00.0000000, der 6275 Wochen von der origin-Standardzeit 1900-01-01 00:00:00.000 entfernt ist.

DECLARE @date DATETIME2 = '2020-04-15 21:22:11';
SELECT DATE_BUCKET(WEEK, 5, @date);

Die Ausgabe für den unten angegebenen Ausdruck ist 2020-06-09 00:00:00.0000000, der 75 Wochen von der angegebenen origin-Zeit 2019-01-01 00:00:00 entfernt ist.

DECLARE @date DATETIME2 = '2020-06-15 21:22:11';
DECLARE @origin DATETIME2 = '2019-01-01 00:00:00';
SELECT DATE_BUCKET(WEEK, 5, @date, @origin);

datepart-Argument

dayofyear, day und weekday geben den gleichen Wert zurück. Jedes datepart-Argument und die jeweils zugehörigen Abkürzungen geben den gleichen Wert zurück.

number-Argument

Das number-Argument kann den Bereich von positiven int-Werten nicht überschreiten. In den folgenden Anweisungen überschreitet das Argument für number den Bereich von int um 1. Die folgende Anweisung gibt folgende Fehlermeldung zurück: Msg 8115, Level 16, State 2, Line 2. Arithmetic overflow error converting expression to data type int.

DECLARE @date DATETIME2 = '2020-04-30 00:00:00';
SELECT DATE_BUCKET(DAY, 2147483648, @date);

Wenn ein negativer Wert für „number“ an die DATE_BUCKET-Funktion übergeben wird, wird der folgende Fehler zurückgegeben.

Msg 9834, Level 16, State 1, Line 1
Invalid bucket width value passed to DATE_BUCKET function. Only positive values are allowed.

date-Argument

DATE_BUCKET gibt den Basiswert zurück, der dem Datentyp des date-Arguments entspricht. Im folgenden Beispiel wird ein Ausgabewert mit dem datetime2-Datentyp zurückgegeben.

SELECT DATE_BUCKET(DAY, 10, SYSUTCDATETIME());

origin-Argument

Die Datentypen der Argumente origin und date müssen identisch sein. Wenn unterschiedliche Datentypen verwendet werden, wird ein Fehler ausgegeben.

Bemerkungen

Verwenden Sie DATE_BUCKET in den folgenden Klauseln:

  • GROUP BY
  • HAVING
  • ORDER BY
  • SELECT <list>
  • WHERE

Beispiele

A. Berechnen von DATE_BUCKET mit einer Bucketbreite von 1 ab der Ursprungszeit

Jede dieser Anweisungen erhöht DATE_BUCKET mit einer Bucketbreite von 1 ab der Ursprungszeit:

DECLARE @date DATETIME2 = '2020-04-30 21:21:21';
SELECT 'Week', DATE_BUCKET(WEEK, 1, @date)
UNION ALL
SELECT 'Day', DATE_BUCKET(DAY, 1, @date)
UNION ALL
SELECT 'Hour', DATE_BUCKET(HOUR, 1, @date)
UNION ALL
SELECT 'Minutes', DATE_BUCKET(MINUTE, 1, @date)
UNION ALL
SELECT 'Seconds', DATE_BUCKET(SECOND, 1, @date);

Hier sehen Sie das Ergebnis.

Week    2020-04-27 00:00:00.0000000
Day     2020-04-30 00:00:00.0000000
Hour    2020-04-30 21:00:00.0000000
Minutes 2020-04-30 21:21:00.0000000
Seconds 2020-04-30 21:21:21.0000000

B. Verwenden von Ausdrücken als Argumente für den number-Parameter und den date-Parameter

In diesen Beispielen werden verschiedene Typen von Ausdrücken als Argumente für die Parameter number und date verwendet.

Diese Beispiele werden mithilfe der AdventureWorksDW2022-Datenbank erstellt.

Angeben von benutzerdefinierten Variablen als Argumente für number und date

In diesem Beispiel werden benutzerdefinierte Variablen als Argumente für number und date angegeben:

DECLARE @days INT = 365,
    @datetime DATETIME2 = '2000-01-01 01:01:01.1110000';
    /* 2000 was a leap year */;
SELECT DATE_BUCKET(DAY, @days, @datetime);

Hier sehen Sie das Ergebnis.

1999-12-08 00:00:00.0000000

Angeben einer Spalte als date-Parameter

Im folgenden Beispiel berechnen wir die Summe von OrderQuantity und die Summe von UnitPrice, gruppiert über wöchentliche date-Buckets.

SELECT DATE_BUCKET(WEEK, 1, CAST(ShipDate AS DATETIME2)) AS ShippedDateBucket
    , SUM(OrderQuantity) AS SumOrderQuantity
    , SUM(UnitPrice) AS SumUnitPrice
FROM dbo.FactInternetSales FIS
WHERE ShipDate BETWEEN '2011-01-03 00:00:00.000'
        AND '2011-02-28 00:00:00.000'
GROUP BY DATE_BUCKET(WEEK, 1, CAST(ShipDate AS DATETIME2))
ORDER BY ShippedDateBucket;

Hier sehen Sie das Ergebnis.

ShippedDateBucket           SumOrderQuantity SumUnitPrice
--------------------------- ---------------- ---------------------
2011-01-03 00:00:00.0000000 21               65589.7546
2011-01-10 00:00:00.0000000 27               89938.5464
2011-01-17 00:00:00.0000000 31               104404.9064
2011-01-24 00:00:00.0000000 36               118525.6846
2011-01-31 00:00:00.0000000 39               123555.431
2011-02-07 00:00:00.0000000 35               109342.351
2011-02-14 00:00:00.0000000 32               107804.8964
2011-02-21 00:00:00.0000000 37               119456.3428
2011-02-28 00:00:00.0000000 9                28968.6982

Angeben einer skalaren Systemfunktion als Argument für date

In diesem Beispiel wird SYSDATETIME für date angegeben. Welcher Wert genau zurückgegeben wird, hängt davon ab, an welchem Tag und zu welcher Uhrzeit die Anweisung ausgeführt wird:

SELECT DATE_BUCKET(WEEK, 10, SYSDATETIME());

Hier sehen Sie das Ergebnis.

2020-03-02 00:00:00.0000000

Angeben von skalaren Unterabfragen und skalaren Funktionen als Argumente für number und date

In diesem Beispiel werden skalare Unterabfragen (MAX(OrderDate)) als Argumente für number und date verwendet. (SELECT top 1 CustomerKey FROM dbo.DimCustomer where GeographyKey > 100) dient als Beispielargument für den Parameter „number“, das veranschaulicht, wie ein number-Argument aus einer Werteliste ausgewählt wird.

SELECT DATE_BUCKET(WEEK, (
    SELECT TOP 1 CustomerKey
    FROM dbo.DimCustomer
    WHERE GeographyKey > 100
    ), (
    SELECT MAX(OrderDate)
    FROM dbo.FactInternetSales
));

Angeben von numerischen Ausdrücken und skalaren Systemfunktionen als Argumente für number und date

In diesem Beispiel werden ein numerischer Ausdruck ((10/2)) und skalare Systemfunktionen (SYSDATETIME) als Argumente für number und date verwendet.

SELECT DATE_BUCKET(WEEK, (10/2), SYSDATETIME());

Angeben einer Aggregatfensterfunktion als Argument für number

In diesem Beispiel wird eine Aggregatfensterfunktion als Argument für number verwendet.

SELECT DISTINCT DATE_BUCKET(DAY, 30, CAST([ShipDate] AS DATETIME2)) AS DateBucket
    , FIRST_VALUE([SalesOrderNumber]) OVER (
        ORDER BY DATE_BUCKET(DAY, 30, CAST([ShipDate] AS DATETIME2))
        ) AS First_Value_In_Bucket
    , LAST_VALUE([SalesOrderNumber]) OVER (
        ORDER BY DATE_BUCKET(DAY, 30, CAST([ShipDate] AS DATETIME2))
        ) AS Last_Value_In_Bucket
FROM [dbo].[FactInternetSales]
WHERE ShipDate BETWEEN '2011-01-03 00:00:00.000'
        AND '2011-02-28 00:00:00.000'
ORDER BY DateBucket;
GO

C. Verwenden eines nicht standardmäßigen Ursprungswerts

In diesem Beispiel wird ein nicht standardmäßiger Ursprungswert für date-Buckets verwendet.

DECLARE @date DATETIME2 = '2020-06-15 21:22:11';
DECLARE @origin DATETIME2 = '2019-01-01 00:00:00';
SELECT DATE_BUCKET(HOUR, 2, @date, @origin);

Weitere Informationen