SQL を使用して日付範囲を生成する方法
SQL を使用する場合、多くの場合、複数の日付にわたってクエリを実行する必要があります。作業する日付の事前定義されたリストがない場合、これは困難になる可能性があります。幸いなことに、SQL で日付の範囲を生成するために使用できる手法がいくつかあります。
一般的なアプローチの 1 つは、CONNECT BY 句を使用することです。この句を使用すると、指定した関係に基づいて一連の行を生成する階層クエリを作成できます。たとえば、次のクエリは過去 365 日のリストを生成します:
SELECT TRUNC(SYSDATE - ROWNUM) dt FROM DUAL CONNECT BY ROWNUM < 366
このクエリは現在の日付 (SYSDATE) から始まり、階層内の行ごとに 1 日を減算します。 ROWNUM 疑似列は現在の行番号を追跡し、CONNECT BY 句により 365 行を生成した後にクエリが停止するようにします。
日付の範囲を生成するもう 1 つのオプションは、CROSS JOIN 演算子を使用することです。 。この演算子を使用すると、一致する列がない場合でも、2 つのテーブルを 1 つの結果セットに結合できます。たとえば、次のクエリは、日と時間のすべての可能な組み合わせのリストを生成します:
SELECT day, hour FROM ( SELECT LEVEL - 1 day FROM DUAL CONNECT BY LEVEL <= 365 ) CROSS JOIN ( SELECT LEVEL - 1 hour FROM DUAL CONNECT BY LEVEL <= 24 )
このクエリは、日のテーブル (最初のサブクエリ) と時間のテーブル (2 番目のサブクエリ) を作成することから始まります。サブクエリ)。次に、CROSS JOIN 演算子は、これら 2 つのテーブルを 1 つの結果セットに結合し、日と時間の可能なすべての組み合わせを生成します。
最後に、ストアド プロシージャを使用して日付の範囲を生成することもできます。ストアド プロシージャは、データベースに保存され、複数回実行できる一連の SQL ステートメントです。次のストアド プロシージャは、過去 365 日のリストを生成します。
CREATE PROCEDURE generate_dates AS BEGIN FOR i IN 1 .. 365 LOOP INSERT INTO dates (dt) VALUES (TRUNC(SYSDATE - i)); END LOOP; END;
このストアド プロシージャは、次のステートメントを呼び出すことで実行できます。
EXECUTE generate_dates;
ストアド プロシージャが作成されると、実行されたら、日付テーブルを使用してクエリを実行できます。
これらは、日付の範囲を生成するために使用できる手法のほんの一部です。 SQLで。最適なアプローチは、アプリケーションの特定のニーズによって異なります。
以上がCONNECT BY、CROSS JOIN、またはストアド プロシージャを使用して SQL で日付の範囲を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。