Megosztás a következőn keresztül:


DATE_BUCKET (Transact-SQL)

Vonatkozik a következőkre: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance Azure SQL Edge SQL database in Microsoft Fabric

Ez a függvény az egyes dátum-idő gyűjtők kezdetének megfelelő dátum-idő értéket adja vissza a forrásparaméter által meghatározott időbélyegből, vagy annak alapértelmezett forrásértékét 1900-01-01 00:00:00.000 , ha a forrásparaméter nincs megadva.

Az összes Transact-SQL dátum - és időadattípus és -függvény áttekintéséhez tekintse meg a Dátum és idő adattípusokat és függvényeket .

Transact-SQL szintaxis konvenciók

Szemantika

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

Arguments

datepart

A számparaméterrel együtt használt dátumrész, például év, hónap, nap, perc, másodperc.

DATE_BUCKET nem fogadja el a felhasználó által definiált változóegyenértékeket a datepart argumentumokhoz.

datepart Abbreviations
nap dd, d
hét wk, ww
hónap Mm, m
negyed qq, q
év yyy, yyyy
óra Hh
perc mi, n
második ss, s
Ezredmásodperc Ms

szám

A gyűjtő szélességét a datepart argumentummal kombináló egész szám. Ez az argumentum a dátumpart gyűjtők szélességét jelöli a forrásidőből. Ez az argumentum nem lehet negatív egész szám.

date

Olyan kifejezés, amely a következő értékek egyikének kell lennie:

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

Dátumként egy oszlopkifejezéstDATE_BUCKET, kifejezést vagy felhasználó által definiált változót fogad el, ha feloldják a korábban említett adattípusok bármelyikét.

eredet

Nem kötelező kifejezés, amely a következő értékek egyikére oldható fel:

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

A forrás adattípusának meg kell egyeznie a dátumparaméter adattípusával.

DATE_BUCKET Az alapértelmezett forrásdátumértéket 1900-01-01 00:00:00.000 használja, amely 1900. január 1-jén, hétfőn 12:00 óra, ha a függvényhez nincs megadva forrásérték .

Visszatérési típusok

A metódus visszatérési érték adattípusa dinamikus. A visszatérési típus a dátumhoz megadott argumentumtól függ. Ha érvényes bemeneti adattípust ad meg a dátumhoz, DATE_BUCKET ugyanazt az adattípust adja vissza. DATE_BUCKEThibát jelez, ha a dátumparaméterhez sztringkonstans van megadva.

Visszaadott érték

A DATE_BUCKET kimenetének ismertetése

DATE_BUCKET A dátumpart és a szám paraméternek megfelelő legújabb dátum- vagy időértéket adja vissza. Az alábbi kifejezésekben például a kimenet értékét DATE_BUCKETadja vissza, 2020-04-13 00:00:00.0000000 mivel a kimenet kiszámítása az alapértelmezett forrásidő egyhetes gyűjtői 1900-01-01 00:00:00.000alapján történik. Az érték 2020-04-13 00:00:00.0000000 a forrásértéktől 1900-01-01 00:00:00.000számítva 6276 hét.

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

SELECT DATE_BUCKET(WEEK, 1, @date);

Az alábbi kifejezéseknél a függvény ugyanazt a kimeneti értéket 2020-04-13 00:00:00.0000000 adja vissza. Ennek az az oka 2020-04-13 00:00:00.0000000 , hogy a származási dátumtól számított 6276 hét, a 6 276 pedig 2, 3, 4 és 6 szerint osztható.

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

Az alábbi kifejezés 2020-04-06 00:00:00.0000000kimenete az alapértelmezett forrásidőtől 1900-01-01 00:00:00.000számított 6275 hét.

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

SELECT DATE_BUCKET(WEEK, 5, @date);

A következő kifejezés kimenete 2020-06-09 00:00:00.0000000a megadott forrásidőtől 2019-01-01 00:00:00számított 75 hét.

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

A datepart argumentum

a napfyear, a day és a weekday ugyanazt az értéket adja vissza. Minden dátumpart és rövidítése ugyanazt az értéket adja vissza.

A szám argumentum

A szám argumentum nem haladhatja meg a pozitív int értékek tartományát . Az alábbi utasításokban a szám argumentuma 1-gyel meghaladja a int tartományt. A következő utasítás a hibaüzenetet adja vissza: 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);

Ha a függvény a szám negatív értékét adja át DATE_BUCKET , a következő hibaüzenet jelenik meg.

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

A dátum argumentum

DATE_BUCKETa dátum argumentum adattípusának megfelelő alapértéket adja vissza. Az alábbi példában egy datetime2 adattípusú kimeneti értéket ad vissza a függvény.

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

A forrás argumentum

A forrás- és dátumargumentumok adattípusának meg kell egyeznie. Ha különböző adattípusokat használ, hiba jön létre.

Megjegyzések

Használja DATE_BUCKET a következő záradékokban:

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

Példák

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. DATE_BUCKET kiszámítása a forrásidőtől számított 1 gyűjtőszélességgel

Mindegyik utasítás 1 gyűjtőszélességgel növekszik DATE_BUCKET a forrásidőtől kezdve:

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

Itt van az eredmények összessége.

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. Kifejezések használata argumentumként a szám- és dátumparaméterekhez

Ezek a példák különböző típusú kifejezéseket használnak a szám- és dátumparaméterek argumentumaként.

Ezek a példák az AdventureWorksDW2025 adatbázis használatával készültek.

Felhasználó által megadott változók megadása számként és dátumként

Ez a példa a felhasználó által definiált változókat adja meg a szám és a dátum argumentumaként:

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

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

Itt van az eredmények összessége.

1999-12-08 00:00:00.0000000

Oszlop megadása dátumként

Az alábbi példában kiszámítjuk a heti dátum gyűjtők szerinti csoportosítás összegét és összegét OrderQuantityUnitPrice .

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;

Itt van az eredmények összessége.

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

Skaláris rendszerfüggvény megadása dátumként

Ez a példa dátumot SYSDATETIMEad meg. A visszaadott pontos érték az utasítás végrehajtásának napjától és időpontjától függ:

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

Itt van az eredmények összessége.

2020-03-02 00:00:00.0000000

Skaláris al lekérdezések és skaláris függvények megadása számként és dátumként

Ez a példa skaláris al lekérdezéseket használ szám és dátum argumentumakéntMAX(OrderDate). (SELECT TOP 1 CustomerKey FROM dbo.DimCustomer WHERE GeographyKey > 100)A számparaméter mesterséges argumentumaként szolgál, amely bemutatja, hogyan választhat ki számargumentumot egy értéklistából.

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

Numerikus kifejezések és skaláris rendszerfüggvények megadása számként és dátumként

Ez a példa numerikus kifejezést () és skaláris rendszerfüggvényt ((10/2)SYSDATETIME) használ szám és dátum argumentumaként.

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

Összesített ablakfüggvény megadása számként

Ez a példa egy összegző ablakfüggvényt használ szám argumentumaként.

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. Nem alapértelmezett forrásérték használata

Ez a példa egy nem alapértelmezett forrásértéket használ a dátumgyűjtők létrehozásához.

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