Delen via


DATE_BUCKET (Transact-SQL)

Van toepassing op: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance Azure SQL Edge SQL database in Microsoft Fabric

Met deze functie wordt de datum/tijd-waarde geretourneerd die overeenkomt met het begin van elke bucket voor datum/tijd van de tijdstempel die is gedefinieerd door de oorspronkelijke parameter, of de standaardwaarde van oorsprong als 1900-01-01 00:00:00.000 de oorspronkelijke parameter niet is opgegeven.

Zie datum- en tijdgegevenstypen en -functies voor een overzicht van alle Transact-SQL datum- en tijdgegevenstypen en -functies.

Transact-SQL syntaxis-conventies

Syntaxis

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

Arguments

datepart

Het deel van de datum dat wordt gebruikt met de getalparameter , bijvoorbeeld jaar, maand, dag, minuut, seconde.

DATE_BUCKETaccepteert geen door de gebruiker gedefinieerde variabelenequivalenten voor de datumonderdelenargumenten.

datepart Abbreviations
dag dd, d
week WK, WW
maand mm,m
wijk qq, q
jaar yyy, jjjj
uur hh
minuut mi, n
tweede ss, s
milliseconde mevrouw

number

Het gehele getal waarmee de breedte van de bucket wordt bepaald in combinatie met het argument datepart . Dit argument vertegenwoordigt de breedte van de datumpart-buckets van de oorspronkelijke tijd. Dit argument kan geen negatieve geheel getalwaarde zijn.

date

Een expressie die een van de volgende waarden moet zijn:

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

Voor datumDATE_BUCKET accepteert u een kolomexpressie, expressie of door de gebruiker gedefinieerde variabele als deze worden omgezet in een van de eerder genoemde gegevenstypen.

oorsprong

Een optionele expressie die kan worden omgezet in een van de volgende waarden:

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

Het gegevenstype voor oorsprong moet overeenkomen met het gegevenstype van de datumparameter .

DATE_BUCKET maakt gebruik van 1900-01-01 00:00:00.000 een standaardwaarde voor de oorsprongsdatum, namelijk 12:00 uur op maandag 1 januari 1900, als er geen oorsprongswaarde is opgegeven voor de functie.

Retourtypen

Het gegevenstype retourwaarde voor deze methode is dynamisch. Het retourtype is afhankelijk van het argument dat is opgegeven voor datum. Als er een geldig invoergegevenstype voor de datum wordt opgegeven, DATE_BUCKET wordt hetzelfde gegevenstype geretourneerd. DATE_BUCKET genereert een fout als een letterlijke tekenreeks is opgegeven voor de datumparameter .

Retourwaarde

Inzicht in de uitvoer van DATE_BUCKET

DATE_BUCKET retourneert de meest recente datum- of tijdwaarde, die overeenkomt met het datumdeel en de numerieke parameter. Retourneert in de volgende expressies bijvoorbeeld de uitvoerwaarde van DATE_BUCKET, omdat de uitvoer wordt berekend op basis van buckets 2020-04-13 00:00:00.0000000 van één week van de standaard oorspronkelijke tijd van 1900-01-01 00:00:00.000. De waarde 2020-04-13 00:00:00.0000000 is 6.276 weken van de oorsprongswaarde van 1900-01-01 00:00:00.000.

DECLARE @date AS DATETIME2 = '2020-04-15 21:22:11';

SELECT DATE_BUCKET(WEEK, 1, @date);

Voor alle volgende expressies wordt dezelfde uitvoerwaarde 2020-04-13 00:00:00.0000000 geretourneerd. Dit komt doordat 2020-04-13 00:00:00.0000000 6.276 weken vanaf de oorspronkelijke datum en 6.276 deelbaar is door 2, 3, 4 en 6.

DECLARE @date AS 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);

De uitvoer voor de volgende expressie is 2020-04-06 00:00:00.0000000, wat 6.275 weken is vanaf de standaard oorspronkelijke tijd 1900-01-01 00:00:00.000.

DECLARE @date AS DATETIME2 = '2020-04-15 21:22:11';

SELECT DATE_BUCKET(WEEK, 5, @date);

De uitvoer voor de volgende expressie is 2020-06-09 00:00:00.0000000, die 75 weken na de opgegeven oorspronkelijke tijd 2019-01-01 00:00:00is.

DECLARE @date AS DATETIME2 = '2020-06-15 21:22:11';
DECLARE @origin AS DATETIME2 = '2019-01-01 00:00:00';

SELECT DATE_BUCKET(WEEK, 5, @date, @origin);

Het argument datepart

dayofyear, day en weekday retourneren dezelfde waarde. Elk datumdeel en de bijbehorende afkortingen geven dezelfde waarde als resultaat.

Het getalargument

Het getalargument kan het bereik van positieve intwaarden niet overschrijden. In de volgende instructies overschrijdt het argument voor getal het bereik van int door 1. De volgende instructie retourneert het foutbericht: Msg 8115, Level 16, State 2, Line 2. Arithmetic overflow error converting expression to data type int.

DECLARE @date AS DATETIME2 = '2020-04-30 00:00:00';

SELECT DATE_BUCKET(DAY, 2147483648, @date);

Als een negatieve waarde voor getal wordt doorgegeven aan de DATE_BUCKET functie, wordt de volgende fout geretourneerd.

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

Het datumargument

DATE_BUCKET retourneert de basiswaarde die overeenkomt met het gegevenstype van het datumargument . In het volgende voorbeeld wordt een uitvoerwaarde met het gegevenstype datetime2 geretourneerd.

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

Het argument oorsprong

Het gegevenstype van de oorspronkelijke en datumargumenten in moet hetzelfde zijn. Als er verschillende gegevenstypen worden gebruikt, wordt er een fout gegenereerd.

Opmerkingen

Gebruik DATE_BUCKET in de volgende componenten:

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

Voorbeelden

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

Eén. Bereken DATE_BUCKET met een bucketbreedte van 1 vanaf de oorspronkelijke tijd

Elk van deze instructies wordt verhoogd DATE_BUCKET met een bucketbreedte van 1 vanaf de oorspronkelijke tijd:

DECLARE @date AS 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 is het resultatenoverzicht.

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. Expressies gebruiken als argumenten voor de parameters getal en datum

In deze voorbeelden worden verschillende typen expressies gebruikt als argumenten voor de getal- en datumparameters.

Deze voorbeelden worden gebouwd met behulp van de AdventureWorksDW2025 database.

Door de gebruiker gedefinieerde variabelen opgeven als getal en datum

In dit voorbeeld worden door de gebruiker gedefinieerde variabelen opgegeven als argumenten voor getal en datum:

DECLARE @days AS INT = 365,
        @datetime AS DATETIME2 = '2000-01-01 01:01:01.1110000';

SELECT DATE_BUCKET(DAY, @days, @datetime);

Hier is het resultatenoverzicht.

1999-12-08 00:00:00.0000000

Een kolom opgeven als datum

In het volgende voorbeeld berekenen we de som van OrderQuantity en de som van UnitPrice gegroepeerde buckets voor wekelijkse datums.

SELECT DATE_BUCKET(WEEK, 1, CAST (ShipDate AS DATETIME2)) AS ShippedDateBucket,
       SUM(OrderQuantity) AS SumOrderQuantity,
       SUM(UnitPrice) AS SumUnitPrice
FROM dbo.FactInternetSales AS 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 is het resultatenoverzicht.

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

Scalaire systeemfunctie opgeven als datum

In dit voorbeeld wordt de datum opgegeven SYSDATETIME. De exacte waarde die wordt geretourneerd, is afhankelijk van de dag en tijd van de uitvoering van de instructie:

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

Hier is het resultatenoverzicht.

2020-03-02 00:00:00.0000000

Scalaire subquery's en scalaire functies opgeven als getal en datum

In dit voorbeeld worden scalaire subquery's gebruikt, MAX(OrderDate)als argumenten voor getal en datum. (SELECT TOP 1 CustomerKey FROM dbo.DimCustomer WHERE GeographyKey > 100) fungeert als een kunstmatig argument voor de getalparameter om te laten zien hoe u een getalargument in een lijst met waarden selecteert.

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

Numerieke expressies en scalaire systeemfuncties opgeven als getal en datum

In dit voorbeeld wordt een numerieke expressie ((10/2)) en scalaire systeemfuncties (SYSDATETIME) gebruikt als argumenten voor getal en datum.

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

Een statistische vensterfunctie opgeven als getal

In dit voorbeeld wordt een statistische vensterfunctie gebruikt als argument voor getal.

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. Een niet-standaardwaarde voor oorsprong gebruiken

In dit voorbeeld wordt een niet-standaardwaarde voor oorsprong gebruikt om de datumbuckets te genereren.

DECLARE @date AS DATETIME2 = '2020-06-15 21:22:11';
DECLARE @origin AS DATETIME2 = '2019-01-01 00:00:00';

SELECT DATE_BUCKET(HOUR, 2, @date, @origin);