2016-04-18 25 views
1

SQL Server 2014を使用していて、テーブルAttendanceがあります。この表には、2列のAttdDateStatusがあります。私はAttdDatestatusの2つの日付の間の日付のリストを返すストアドプロシージャを作成したいと思います。 AttdDateがこのリストにある場合(日付リスト)ステータスはtrueでなければなりません。そうでない場合、ステータスはfalseになります。SQL Serverストアドプロシージャで2つの日付間のすべての日付を取得します。

アドバイスはありますか?あなたはこのために再帰クエリを使用することができますおかげ

答えて

1
CREATE PROCEDURE sp_Attendance @Start DATETIME, @End DATETIME 
AS 
BEGIN 
    DECLARE @NumDays INT; 
    -- This will give you the number of days between your start date and end date. 
    SELECT @NumDays = DATEDIFF(DAY, @Start, @End) + 1; 
    WITH CTE AS (
     SELECT TOP (@Numdays) 
      /* 
      ROW_NUMBER() OVER (ORDER BY a.object_id) will give you an integer from 1 to @NumDays becuase of TOP (@NumDays) 
      ROW_NUMBER() OVER (ORDER BY a.object_id) - 1 will give you an integer from 0 to @NumDays 
      DATEADD(DAY, ROW_NUMBER(), @Start) -- This will add the integer from the row number statement to your start date. 
      i.e. 
       @Start + 0 
       @Start + 1 
       @Start + 2 
       etc 
       etc 
       @Start + @NumDays   
      */ 
      DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY a.object_id) - 1, @Start) AS AttdDate 
     FROM 
      sys.all_columns a 
     CROSS JOIN 
      sys.all_columns b) 
    SELECT 
     c.AttdDate, 
     CASE WHEN a.AttdDate IS NOT NULL THEN 1 ELSE 0 END AS Status 
    FROM 
     CTE c 
    LEFT JOIN 
     Attendance a 
      ON c.AttdDate = a.AttdDate; 
END; 
+0

これは素晴らしいです。本当にあなたは私の時間を節約しました。ありがとうございました – prime

+0

本当に感謝しています。 1、@start) FROM AttdDate AS CROSSをsys.all_columns - しかし、CTE AS( SELECTのTOP(@Numdays)a.object_id BY DATEADD(DAY、ROW_NUMBER()OVER(ORDER)WITHこの部分を「説明してくださいJOIN sys.all_columns b) " – prime

+0

説明に役立つコメントをコードに追加しました。 –

0

WITH q(d) AS 
     (
     SELECT @mindate 
     UNION ALL 
     SELECT DATEADD(day, 1 d) 
     FROM q 
     WHERE d < @maxdate 
     ) 
SELECT * 
FROM q 
OPTION (MAXRECURSION 0) 

を、しかし、その性能は、長い範囲のために非常に悪いだろう。

私は通常ちょうど私のSQL Serverデータベースに2100年までにすべての可能な日付を持つテーブルを作成します。

SELECT * 
FROM dates 
WHERE d BETWEEN @mindate AND @maxdate 
関連する問題