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)