Udostępnij za pośrednictwem


DATE_BUCKET (Transact-SQL)

Ważne

Usługa Azure SQL Edge nie obsługuje już platformy ARM64.

Ta funkcja zwraca wartość daty/godziny odpowiadającą początku każdego przedziału daty/godziny z sygnatury czasowej zdefiniowanej przez origin parametr lub domyślną wartość źródła, 1900-01-01 00:00:00.000 jeśli parametr źródła nie jest określony.

Zobacz Typy i funkcje danych daty i godziny (Transact-SQL), aby zapoznać się z omówieniem wszystkich typów danych i funkcji daty i godziny języka Transact-SQL.

Konwencje składni języka Transact-SQL

Składnia

DATE_BUCKET (datePart , number , date , origin)

Argumenty

Datepart

Część daty , która jest używana z parametrem "number", jak pokazano w poniższej tabeli. DATE_BUCKET nie akceptuje odpowiedników zmiennych zdefiniowanych przez użytkownika dla argumentów datePart .

Datepart Skróty
Dzień dd, d
Tygodniu wk, ww
Miesiąc mm, m
Kwartale qq, q
Roku yy, yyyy
Godziny hh
Minut mi, n
Drugi ss, s
Milisekundy Pani

Numer

Liczba całkowita, która decyduje o szerokości zasobnika połączonego z argumentem datePart. Reprezentuje to szerokość zasobników datePart z godziny początkowej. Ten argument musi być dodatnią wartością całkowitą.

Data

Wyrażenie, które może rozpoznać jedną z następujących wartości:

  • Data
  • Datetime
  • data/godzina2
  • Datetimeoffset
  • Smalldatetime
  • Czas

W przypadku daty akceptuje wyrażenie kolumny, wyrażenie lub zmienną zdefiniowaną przez użytkownika, DATE_BUCKET jeśli zostaną rozpoznane dla dowolnego z wymienionych wcześniej typów danych.

Pochodzenia

Opcjonalne wyrażenie, które może rozpoznać jedną z następujących wartości:

  • Data
  • Datetime
  • data/godzina2
  • Datetimeoffset
  • Smalldatetime
  • Czas

Typ danych źródła powinien być zgodny z typem danych parametru daty.

DATE_BUCKET Używa domyślnej 1900-01-01 00:00:00.000wartości daty pochodzenia , czyli 12:00 w poniedziałek, 1 stycznia 1900 r., jeśli dla funkcji nie określono żadnej wartości źródła .

Typ Zwrot

Zwracany typ danych wartości dla tej metody jest dynamiczny. Typ zwracany zależy od argumentu podanego dla daty. Jeśli dla daty podano prawidłowy typ danych wejściowych, DATE_BUCKET zwraca ten sam typ danych. DATE_BUCKET zgłasza błąd, jeśli dla parametru daty określono literał ciągu.

Wartości zwracane

Informacje o danych wyjściowych z DATE_BUCKET

DATE_BUCKET Zwraca najnowszą wartość daty lub godziny odpowiadającą parametrom datePart i number . Na przykład w poniższych wyrażeniach DATE_BUCKET zwraca wartość 2020-04-13 00:00:00.0000000wyjściową elementu , ponieważ dane wyjściowe są obliczane na podstawie przedziałów jednego tygodnia z domyślnego czasu początkowego 1900-01-01 00:00:00.000. Wartość 2020-04-13 00:00:00.0000000 to 6276 tygodni od wartości początkowej 1900-01-01 00:00:00.000.

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

SELECT DATE_BUCKET(WEEK, 1, @date);

Dla wszystkich poniższych wyrażeń zwracana jest ta sama wartość wyjściowa 2020-04-13 00:00:00.0000000 . Jest to spowodowane tym, że 2020-04-13 00:00:00.0000000 jest to 6276 tygodni od daty pochodzenia, a 6276 jest podzielny przez 2, 3, 4 i 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);

Dane wyjściowe poniższego wyrażenia to 2020-04-06 00:00:00.0000000, czyli 6275 tygodni od domyślnego czasu 1900-01-01 00:00:00.000pochodzenia .

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

SELECT DATE_BUCKET(WEEK, 5, @date);

Dane wyjściowe poniższego wyrażenia to 2020-06-09 00:00:00.0000000 , czyli 75 tygodni od określonego czasu 2019-01-01 00:00:00pochodzenia .

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

Uwagi

Użyj DATE_BUCKET w następujących klauzulach:

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

Argument datePart

dayofyear, day i weekday zwracają tę samą wartość. Każdy element datePart i jego skróty zwracają tę samą wartość.

argument number

Argument liczbowy nie może przekraczać zakresu dodatnich wartości int . W poniższych instrukcjach argument liczby przekracza zakres int o 1. Poniższa instrukcja zwraca następujący komunikat o błędzie: 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);

Jeśli do funkcji zostanie przekazana DATE_BUCKET wartość ujemna, zostanie zwrócony następujący błąd.

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

argument daty

DATE_BUCKET Zwraca wartość podstawową odpowiadającą typowi danych argumentu daty . W poniższym przykładzie zwracana jest wartość wyjściowa z typem danych datetime2 .

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

argument źródła

Typ danych argumentów źródła i daty w pliku musi być taki sam. Jeśli są używane różne typy danych, zostanie wygenerowany błąd.

Przykłady

Odp. Obliczanie DATE_BUCKET o szerokości zasobnika 1 od czasu pochodzenia

Każda z tych instrukcji zwiększa DATE_BUCKET o szerokości zasobnika 1 od czasu pochodzenia:

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

Oto zestaw wyników.

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. Użyj wyrażeń jako argumentów dla parametrów liczby i daty

W tych przykładach użyto różnych typów wyrażeń jako argumentów dla parametrów liczby i daty . Te przykłady są tworzone przy użyciu bazy AdventureWorksDW2019 danych.

Określanie zmiennych zdefiniowanych przez użytkownika jako liczby i daty

W tym przykładzie określono zmienne zdefiniowane przez użytkownika jako argumenty dla liczby i daty:

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

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

Oto zestaw wyników.

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

(1 row affected)

Określanie kolumny jako daty

W poniższym przykładzie obliczamy sumę wartości OrderQuantity i sumę kolumn UnitPrice pogrupowanych w przedziały dat tygodniowych.

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;

Oto zestaw wyników.

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

Określ funkcję systemu skalarną jako datę

W tym przykładzie SYSDATETIME określono datę. Dokładna zwrócona wartość zależy od dnia i godziny wykonania instrukcji:

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

Oto zestaw wyników.

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

(1 row affected)

Określanie podzapytania skalarnego i funkcji skalarnych jako liczby i daty

W tym przykładzie użyto podzapytania skalarnych, MAX(OrderDate), jako argumentów dla liczby i daty. (SELECT top 1 CustomerKey FROM dbo.DimCustomer where GeographyKey > 100)służy jako sztuczny argument dla parametru number, aby pokazać, jak wybrać argument liczbowy z listy wartości.

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

Określanie wyrażeń liczbowych i funkcji systemu skalarnego jako liczby i daty

W tym przykładzie użyto wyrażenia liczbowego ((10/2)) i funkcji systemu skalarnego (SYSDATETIME) jako argumentów liczby i daty.

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

Określanie funkcji okna agregacji jako liczby

W tym przykładzie użyto funkcji okna agregacji jako argumentu dla liczby.

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. Używanie wartości innej niż domyślna źródła

W tym przykładzie użyto wartości innej niż domyślna źródła do wygenerowania zasobników dat.

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

Zobacz też