Sdílet prostřednictvím


DATE_BUCKET (Transact-SQL)

Důležité

Azure SQL Edge bude vyřazeno 30. září 2025. Další informace a možnosti migrace najdete v oznámení o vyřazení.

Poznámka:

Azure SQL Edge už nepodporuje platformu ARM64.

Tato funkce vrátí hodnotu datetime odpovídající začátku každého kontejneru datetime z časového razítka definovaného origin parametrem nebo výchozí počáteční hodnotou 1900-01-01 00:00:00.000 , pokud není zadaný parametr původu.

Přehled všech datových typů a funkcí jazyka Transact-SQL najdete v tématu Datové typy a funkce data a času jazyka Transact-SQL .

Konvence syntaxe jazyka Transact-SQL

Syntaxe

DATE_BUCKET (datePart , number , date , origin)

Argumenty

datePart

Část data , která se používá s parametrem number, jak je znázorněno v následující tabulce. DATE_BUCKET nepřijímá ekvivalenty uživatelem definovaných proměnných pro argumenty datePart .

datePart Abbreviations
den dd, d
týden wk, ww
měsíc mm, m
čtvrt qq, q
rok yyy, yyyyy
hodina hh
minuta mi, n
vteřina ss, s
milisekunda milisekunda

číslo

Celé číslo, které rozhoduje o šířce kontejneru v kombinaci s argumentem datePart. Představuje šířku kontejnerů datePart z času původu. Tento argument musí být kladná celočíselná hodnota.

rande

Výraz, který se dá přeložit na jednu z následujících hodnot:

  • rande
  • datetime
  • datetime2
  • datetimeoffset
  • smalldatetime
  • Čas

Pro datum přijímá výraz sloupce, výraz nebo uživatelem definovanou proměnnou, DATE_BUCKET pokud se přeloží na některý z datových typů uvedených výše.

původ

Volitelný výraz, který se dá přeložit na jednu z následujících hodnot:

  • rande
  • datetime
  • datetime2
  • datetimeoffset
  • smalldatetime
  • Čas

Datový typ pro původ by se měl shodovat s datovým typem parametru data .

DATE_BUCKETpoužívá výchozí hodnotu data původu 1900-01-01 00:00:00.000, tj. 12:00 v pondělí 1. ledna 1900, pokud pro funkci není zadána žádná počáteční hodnota.

Návratový typ

Datový typ návratové hodnoty pro tuto metodu je dynamický. Návratový typ závisí na argumentu zadaném pro datum. Pokud je pro datum zadán platný vstupní datový typ, DATE_BUCKET vrátí stejný datový typ. DATE_BUCKET vyvolá chybu, pokud je pro parametr date zadán řetězcový literál.

Vrácené hodnoty

Vysvětlení výstupu z DATE_BUCKET

DATE_BUCKET vrátí nejnovější hodnotu data nebo času odpovídající parametrům datePart a číslování . Například v následujících výrazech DATE_BUCKET vrátí výstupní hodnotu 2020-04-13 00:00:00.0000000, protože výstup se vypočítá na základě intervalů jednoho týdne z výchozího počátečního 1900-01-01 00:00:00.000času . Hodnota 2020-04-13 00:00:00.0000000 je 6276 týdnů od hodnoty původu 1900-01-01 00:00:00.000.

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

SELECT DATE_BUCKET(WEEK, 1, @date);

Pro všechny následující výrazy se vrátí stejná výstupní hodnota 2020-04-13 00:00:00.0000000 . Je to proto, že 2020-04-13 00:00:00.0000000 6276 týdnů od data původu a 6276 je dělitelné 2, 3, 4 a 6.

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

Výstup pro níže uvedený výraz je 2020-04-06 00:00:00.0000000, což je 6275 týdnů od výchozího počátečního času 1900-01-01 00:00:00.000.

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

SELECT DATE_BUCKET(WEEK, 5, @date);

Výstup pro níže uvedený výraz je 2020-06-09 00:00:00.0000000 , což je 75 týdnů od zadaného času 2019-01-01 00:00:00původu .

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

Poznámky

Použijte DATE_BUCKET v následujících klauzulích:

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

Argument datePart

denofyear, day a weekday vrátí stejnou hodnotu. Každá část datePart a její zkratky vrátí stejnou hodnotu.

číselný argument

Číselný argument nemůže překročit rozsah kladných int hodnot. V následujících příkazech argument pro číslo překračuje rozsah int o 1. Následující příkaz vrátí následující chybovou zprávu: 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);

Pokud funkci předá DATE_BUCKET záporná hodnota čísla, vrátí se následující chyba.

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

Argument data

DATE_BUCKET vrátí základní hodnotu odpovídající datovému typu argumentu data . V následujícím příkladu se vrátí výstupní hodnota s datovým typem datetime2 .

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

argument origin

Datový typ argumentů původu a data musí být stejný. Pokud se používají různé datové typy, vygeneruje se chyba.

Příklady

A. Výpočet DATE_BUCKET s šířkou kbelíku 1 z času původu

Každý z těchto příkazů zvýší DATE_BUCKET o šířku kbelíku 1 z doby původu:

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

Tady je sada výsledků.

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. Použití výrazů jako argumentů pro parametry čísla a data

Tyto příklady používají různé typy výrazů jako argumenty pro parametry čísla a data . Tyto příklady jsou sestaveny pomocí AdventureWorksDW2019 databáze.

Zadání uživatelem definovaných proměnných jako čísla a data

Tento příklad určuje uživatelem definované proměnné jako argumenty pro číslo a datum:

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

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

Tady je sada výsledků.

---------------------------
1999-12-08 00:00:00.0000000

(1 row affected)

Zadání sloupce jako data

V následujícím příkladu počítáme součet OrderQuantity a součet UnitPrice seskupených v týdenních intervalech kalendářních dat.

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;

Tady je sada výsledků.

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

Určení skalární systémové funkce jako data

Tento příklad určuje SYSDATETIME datum. Přesná vrácená hodnota závisí na dni a čase provádění příkazu:

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

Tady je sada výsledků.

---------------------------
2020-03-02 00:00:00.0000000

(1 row affected)

Určení skalárních poddotazů a skalárních funkcí jako čísla a data

V tomto příkladu se jako argumenty pro číslo a datum používají skalární poddotazyMAX(OrderDate). (SELECT top 1 CustomerKey FROM dbo.DimCustomer where GeographyKey > 100)slouží jako umělý argument parametru čísla, který ukazuje, jak vybrat číselný argument ze seznamu hodnot.

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

Určení číselných výrazů a skalárních systémových funkcí jako čísla a data

Tento příklad používá číselný výraz ((10/2)) a skalární systémové funkce (SYSDATETIME) jako argumenty pro číslo a datum.

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

Zadání agregační funkce okna jako čísla

Tento příklad používá agregační funkci okna jako argument pro číslo.

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. Použití jiné než výchozí hodnoty zdroje

V tomto příkladu se k vygenerování kontejnerů kalendářních dat používá jiná než výchozí počáteční hodnota.

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