Date_Bucket (Transact-SQL)

Tato funkce vrací hodnotu DateTime odpovídající začátku každého kontejneru DateTime, z časového razítka definovaného origin parametrem nebo výchozí hodnotou, 1900-01-01 00:00:00.000 Pokud není zadán parametr Origin.

přehled všech datových typů a funkcí data a času v jazyce transact-SQL najdete v tématu datové typy a funkce data a času (v jazyce transact-SQL) .

konvence syntaxe pro Transact-SQL

Syntaxe

DATE_BUCKET (datePart, number, date, origin)

Argumenty

datePart

Část data , která se používá s parametrem ' Number '. Například Rok, měsíc, minuta, druhý atd.

Poznámka

DATE_BUCKET nepřijímá uživatelsky definované proměnné ekvivalenty pro argumenty datePart .

datePart Zkratky
dnu DD, d
týden týden, WW
month mm, m
první QQ, q
year YY, RRRR
hodiny hh
minute mi, n
second SS, s
komponentu Arial

Automatické

Celé číslo, které určuje šířku kontejneru v kombinaci s argumentem datePart . To představuje šířku kontejnerů DataParts od počátečního času. This argument cannot be a negative integer value.

date

Výraz, který může být přeložen na jednu z následujících hodnot:

  • date
  • datetime
  • datetime2
  • DateTimeOffset
  • smalldatetime
  • interval

Pro Datum DATE_BUCKET bude akceptovat výraz sloupce, výraz nebo uživatelsky definovaná proměnná, pokud se přeloží na některý z výše uvedených typů dat.

Zdroji

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

  • date
  • datetime
  • datetime2
  • DateTimeOffset
  • smalldatetime
  • interval

Datový typ Origin by měl odpovídat datovému typu Date parametru.

DATE_BUCKET používá výchozí hodnotu data původu, 1900-01-01 00:00:00.000 tj. 12:00 dop. ledna 1 1900, pokud pro funkci není zadána žádná hodnota Origin.

Návratový typ

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

Návratové hodnoty

Princip výstupu DATE_BUCKET

Date_Bucket Vrátí nejnovější hodnotu data nebo času odpovídající parametru datePart a Number. Například ve výrazech níže Date_Bucket vrátí výstupní hodnotu 2020-04-13 00:00:00.0000000 , protože výstup se vypočítá na základě jednoho týdenního intervalu z výchozího počátečního času 1900-01-01 00:00:00.000 . Hodnota 2020-04-13 00:00:00.0000000 je 6276 týdnů od počáteční hodnoty 1900-01-01 00:00:00.000 .

declare @date datetime2 = '2020-04-15 21:22:11'
Select DATE_BUCKET(wk, 1, @date)

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

declare @date datetime2 = '2020-04-15 21:22:11'
Select DATE_BUCKET(wk, 2, @date)
Select DATE_BUCKET(wk, 3, @date)
Select DATE_BUCKET(wk, 4, @date)
Select DATE_BUCKET(wk, 6, @date)

Výstup níže uvedeného výrazu je 2020-04-06 00:00:00.0000000 , což je 6275 týdnů z výchozího času původu 1900-01-01 00:00:00.000 .

declare @date datetime2 = '2020-04-15 21:22:11'
Select DATE_BUCKET(wk, 5, @date)

Níže uvedený výstup výrazu je 2020-06-09 00:00:00.0000000 , což je 75 týdnů od zadaného počátečního času 2019-01-01 00:00:00 .

declare @date datetime2 = '2020-06-15 21:22:11'
declare @origin datetime2 = '2019-01-01 00:00:00'
Select DATE_BUCKET(wk, 5, @date, @origin)

Argument DatePart

DAYOFYEAR, Day a Weekday vrací stejnou hodnotu. Každé DatePart a jeho zkratky vrací stejnou hodnotu.

Argument Number

Argument Number nemůže být větší než rozsah kladných hodnot typu int . 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(dd, 2147483648, @date)

Pokud je do funkce předána záporná hodnota pro číslo Date_Bucket , 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 date argumentu. V následujícím příkladu je vrácena výstupní hodnota s datovým typem datetime2.

Select DATE_BUCKET(dd, 10, SYSUTCDATETIME())

Argument Origin

Datový typ origin argumentů a v nástroji date musí být stejný. Pokud se používají různé datové typy, vygeneruje se chyba.

Poznámky

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

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

Příklady

A. Výpočet Date_Bucket se šířkou intervalu 1 od počátku

Každý z těchto příkazů zvyšuje date_bucket o šířce intervalu 1 od počátku:

declare @date datetime2 = '2020-04-30 21:21:21'
Select 'Week',  DATE_BUCKET(wk, 1, @date)
Union All
Select 'Day',  DATE_BUCKET(dd, 1, @date)
Union All
Select 'Hour',  DATE_BUCKET(hh, 1, @date)
Union All
Select 'Minutes',  DATE_BUCKET(mi, 1, @date)
Union All
Select 'Seconds',  DATE_BUCKET(ss, 1, @date)

Zde 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 Number a Date

Tyto příklady používají jako argumenty pro parametry Number a Date různé typy výrazů. Tyto příklady jsou sestaveny pomocí databáze ' AdventureWorksDW2017 '.

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

Zde 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 (ObjednanéMnozství) a součtu UnitPrice (JednotkováCena) seskupených do intervalů týdenního data.

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 1

Zde 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 pro datum. Přesná vrácená hodnota závisí na dni a čase spuštění příkazu:

SELECT Date_Bucket(wk, 10, SYSDATETIME());

Zde 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

Tento příklad používá skalární poddotazy , jako argumenty čísla a MAX(OrderDate) data. (SELECT top 1 CustomerKey FROM dbo.DimCustomer where GeographyKey > 100) slouží jako umělý argument parametru čísla, který ukazuje, jak vybrat argument čísla 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í funkce agregovaného okna jako čísla

Tento příklad používá funkci agregovaného okna jako argument čísla.

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 původu

V tomto příkladu se k vygenerování kbelíků dat používá hodnota původu, která není výchozí.

declare @date datetime2 = '2020-06-15 21:22:11'
declare @origin datetime2 = '2019-01-01 00:00:00'
Select DATE_BUCKET(hh, 2, @date, @origin)

Viz také

Cast a CONVERT (Transact-SQL)