次の方法で共有


DATE_BUCKET (Transact-SQL)

適用対象: SQL Server 2022 (16.x) Azure SQL Database Azure SQL Managed Instance Azure SQL Edge

基準のパラメーターが指定されていない場合は、この関数は、origin パラメーターまたは 1900-01-01 00:00:00.000 の既定の基準値で定義されたタイムスタンプから、各 date-time バケットの開始に対応する date-time 値を返します。

Transact-SQL の日付と時刻のデータ型および関数の概要については、「日付と時刻のデータ型および関数 (Transact-SQL)」を参照してください。

Transact-SQL 構文表記規則

構文

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

引数

datepart

number パラメーターで使用される "日付" の部分 (年、月、日、分、秒など)。

DATE_BUCKET は、datepart 引数に関して、ユーザー定義変数に相当するものは受け入れられません。

datepart 省略形
day ddd
week wkww
month mmm
quarter qqq
year yyyyyy
hour hh
minute min
second sss
millisecond ms

number

datepart 引数と組み合わされてバケットの幅を決定する整数値。 これは、基準日時からの datepart バケットの幅を表します。 この引数を負の整数値にすることはできません。

date

次のいずれかの値に解決できる式。

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

date については、上記のデータ型に解決される場合は、列式、式、またはユーザー定義変数が DATE_BUCKET で受け付けられます。

配信元

次のいずれかの値に解決できるオプションの式:

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

origin のデータ型は、date パラメーターのデータ型と一致する必要があります。

DATE_BUCKET では、origin 値が関数に指定されていない場合は、既定の日付の基準値として 1900-01-01 00:00:00.000、つまり 1900 年 1 月 1 日 (月) 午前 0:00 が使用されます。

の戻り値の型 :

このメソッドの戻り値のデータ型は動的です。 戻り値の型は、date に与えられた引数によって異なります。 有効な入力データ型が date に指定された場合、DATE_BUCKET からは同じデータ型が返されます。 date パラメーターに対して文字列リテラルを指定した場合は、DATE_BUCKET でエラーが発生します。

戻り値

DATE_BUCKET からの出力について

DATE_BUCKET からは、datepart および number パラメーターに対応する、最も新しい日付または時刻の値が返されます。 たとえば、次の式では、既定の基準日時 1900-01-01 00:00:00.000 からの 1 週間のバケットに基づいて出力が計算されるため、DATE_BUCKET から返される出力値は 2020-04-13 00:00:00.0000000 になります。 値 2020-04-13 00:00:00.0000000 は、基準値 1900-01-01 00:00:00.000 から 6,276 週です。

DECLARE @date DATETIME2 = '2020-04-15 21:22:11';
SELECT DATE_BUCKET(WEEK, 1, @date);

以下のすべての式に対して、同じ出力値 2020-04-13 00:00:00.0000000 が返されます。 これは、2020-04-13 00:00:00.0000000 は基準の日付から 6,276 週であり、6,276 は 2、3、4、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);

下の式の出力は、既定の基準の日時 1900-01-01 00:00:00.000 から 6275 週である 2020-04-06 00:00:00.0000000 になります。

DECLARE @date DATETIME2 = '2020-04-15 21:22:11';
SELECT DATE_BUCKET(WEEK, 5, @date);

下の式の出力は、指定された基準の日時 2019-01-01 00:00:00 から 75 週である 2020-06-09 00:00:00.0000000 になります。

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

datepart 引数

dayofyearday、および weekday は同じ値を返します。 -各日付構成要素とその省略形は、同じ値を返します。

number 引数

number 引数は、正の int 値の範囲を超えることはできません。 次のステートメントでは、number の引数が int の範囲を 1 超えています。 以下のステートメントからは、次のエラー メッセージが返されます: 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);

DATE_BUCKET 関数に負の値の number を渡すと、次のエラーが返されます。

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

date 引数

DATE_BUCKET からは、date 引数のデータ型に対応するベース値が返されます。 次の例では、datetime2 データ型の出力値が返されます。

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

origin 引数

origindate の引数のデータ型は同じである必要があります。 異なるデータ型を使用すると、エラーが生成されます。

解説

次の句で DATE_BUCKET を使用します。

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

A. バケットの幅を 1 にして基準日時からの DATE_BUCKET を計算する

以下の各ステートメントでは、基準日時からのバケット幅 1 で DATE_BUCKET がインクリメントされます。

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

結果セットは次のとおりです。

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. number パラメーターと date パラメーターの引数として式を使用する

次の例では、number パラメーターと date パラメーターの引数として、さまざまな種類の式を使用しています。

これらの例は、AdventureWorksDW2022 データベースを使用して構築されています。

number および date にユーザー定義変数を指定する

次の例では、numberdate の引数としてユーザー定義変数を指定しています。

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

結果セットは次のとおりです。

1999-12-08 00:00:00.0000000

列を date として指定する

次の例では、週単位の日付バケットでグループ化された OrderQuantityUnitPrice の合計が計算されています。

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;

結果セットは次のとおりです。

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

スカラー システム関数を date として指定する

この例では、dateSYSDATETIME を指定しています。 返される厳密な値は、ステートメント実行の日時によって変わります。

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

結果セットは次のとおりです。

2020-03-02 00:00:00.0000000

number および date にスカラー サブクエリやスカラー関数を指定する

次の例では、numberdate の引数として、スカラー サブクエリ (MAX(OrderDate)) を使用しています。 (SELECT top 1 CustomerKey FROM dbo.DimCustomer where GeographyKey > 100) は、値リストから number 引数を選択する方法を紹介するために用意した、数値パラメーターの架空の引数です。

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

number および date として数値式やスカラー システム関数を指定する

この例では、数値式 ((10/2)) を使用し、number と date の引数としてスカラー システム関数 (SYSDATETIME) を使用しています。

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

number として集計関数を指定する

次の例では、number の引数として集計関数を使用しています。

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. 既定以外の基準値を使用する

この例では、既定以外の基準値を使用して、日付バケットを生成します。

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

関連項目