ホームページ >データベース >mysql チュートリアル >T-SQL で一連の日付を効率的に生成するにはどうすればよいですか?

T-SQL で一連の日付を効率的に生成するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-11 20:01:43776ブラウズ

How Can I Efficiently Generate a Series of Dates in T-SQL?

T-SQL 日付シーケンスを効率的に生成する

さまざまなデータ処理タスクでは、指定された範囲内の日付結果セットを作成する必要があることがよくあります。たとえば、開始日と終了日の間の日付のリストを生成する必要があります。

ループベースのメソッド

日付シーケンスを生成する一般的な方法は、以下に示すように WHILE ループを使用することです。

<code class="language-sql">-- 此方法效率低下,尤其是在处理大范围日期时。</code>

ただし、このアプローチは、特に広範囲の日付を扱う場合には非効率的です。

数表を使用する

より効率的な解決策は、1 から 2047 までの一連の数値を提供する MASTER.DBO.SPT_VALUES テーブルを利用することです。このテーブルを DATETADD 関数で使用すると、次のクエリを使用して指定された範囲内の日付のセットを生成できます:

<code class="language-sql">DECLARE @dt datetime, @dtEnd datetime
SET @dt = GETDATE()
SET @dtEnd = DATEADD(DAY, 100, @dt)

SELECT DATETADD(DAY, number, @dt)
FROM (SELECT number FROM MASTER.DBO.SPT_VALUES WHERE TYPE = 'P') AS n
WHERE DATETADD(DAY, number, @dt) < @dtEnd</code>

このクエリは、@dt から @dtEnd-1 までの日付の結果セットを生成します。

SQL Server 2008 以降の機能

SQL Server 2008 では、数値シーケンスを生成できる GENERATE_SERIES 関数が導入されました。この関数を使用すると、次のように日付結果セットを生成できます (SQL Server 2008 以降):

<code class="language-sql">DECLARE @Start datetime, @End datetime
SET @Start = '2024-01-01'
SET @End = '2024-12-31'

SELECT DATEADD(DAY, n, @Start)
FROM (SELECT TOP (DATEDIFF(DAY, @Start, @End) + 1) n = ROW_NUMBER() OVER (ORDER BY object_id)) AS SubTable
ORDER BY n</code>

このクエリは、@Start から @End (両端を含む) までの日付の結果セットを返します。

これらの手法を使用すると、T-SQL でユーザー定義の範囲内で増加する日付の結果セットを効率的に生成できます。

以上がT-SQL で一連の日付を効率的に生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。