ホームページ >データベース >mysql チュートリアル >SQLで指定された日付範囲内の毎日のレコードをカウントするにはどうすればよいですか?
2 つの日付間の各日付のレコード数を計算する
データベース システムでは、多くの場合、指定された日付に基づいてデータを取得する必要があります。範囲。 SQL には、このタスクを容易にするための組み込み関数と手法が用意されています。この記事では、指定された日付範囲内の各日付のレコード数を計算するという課題に取り組みます。問題ステートメント
2 つの日付が与えられた場合、その目的は、その範囲内の各日付のレコード数を返すクエリ。説明のために、2020 年 11 月 1 日から 2021 年 2 月 22 日までの間に作成されたサポート リクエストの数を、tbl_Support_Requests という名前のテーブルから取得すると仮定します。失敗した試行
この問題を解決するための最初の試みには、Common Table Expression (CTE) という名前の使用が含まれていました。 Date_Range_T を使用して、指定された範囲内の日付の連続リストを生成します。ただし、CTE の再帰的定義により、datetime2 と int の間でオペランド型の衝突が発生しました。解決策
この問題を克服するには、より効率的なアプローチは、タリーを利用することです。テーブルまたは関数。集計テーブル (数値ジェネレータとも呼ばれます) は、日付の範囲を生成するためのソースとして機能する一連の連続した数値を提供します。以下は、Itzik Ben-Gan の集計テーブル関数を使用した最適化されたソリューションです。DECLARE @StartDate date = '2020-11-01', @EndDate date = '2021-02-22'; WITH L0 AS ( SELECT 1 AS c FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1), (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ), L1 AS ( SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B ), L2 AS ( SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B ), Nums AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum FROM L2 ) Date_Range_T (d_range) AS ( SELECT TOP(DATEDIFF(day, @StartDate, @EndDate) + 1) DATEADD(day, rownum - 1, @StartDate) AS d_range, DATEADD(day, rownum, @StartDate) AS d_rangeNext FROM Nums ) SELECT d_range, COUNT(Id) AS Total FROM Date_Range_T LEFT JOIN tbl_Support_Requests R ON R.CreatedDate >= T.d_range AND R.CreatedDate < T.d_rangeNext GROUP BY d_range ORDER BY d_range ASCこのソリューションは、エンドポイントの日付を含む、指定された範囲 (#StartDate# から #EndDate#) 内の日付の範囲を生成します。次に、この範囲テーブルを CreatedDate 列の tbl_Support_Requests テーブルと結合し、各日付範囲内に該当するレコードをフィルタリングします。最後に、結果を日付ごとにグループ化し、日付ごとのレコード数をカウントします。
以上がSQLで指定された日付範囲内の毎日のレコードをカウントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。