ホームページ > データベース > mysql チュートリアル > CONNECT BY、CROSS JOIN、またはストアド プロシージャを使用して SQL で日付の範囲を生成するにはどうすればよいですか?

CONNECT BY、CROSS JOIN、またはストアド プロシージャを使用して SQL で日付の範囲を生成するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-06 16:47:45
オリジナル
307 人が閲覧しました

How to Generate a Range of Dates in SQL Using CONNECT BY, CROSS JOIN, or Stored Procedures?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート