2017-10-08 4 views
1

これで2日間のすべての日を取得できます。私は、このテーブル内のすべての開始日と終了日の間のすべての日を見つける必要がある、と予想される結果は、次のようにする必要がありセットベースのアプローチで、複数の日付を複数の日付の間に印刷する

----------------------------------------------------------- 
| ID |  StartDate   |   EndDate   | 
----------------------------------------------------------- 
| 1 | 2017-05-12 00:00:00.000 | 2017-05-15 00:00:00.000 | 
| 2 | 2018-08-10 00:00:00.000 | 2018-08-13 00:00:00.000 | 
| 3 | 2019-02-12 00:00:00.000 | 2019-02-13 00:00:00.000 | 
----------------------------------------------------------- 

DECLARE @MinDate DATE = '20140101' , 
     @MaxDate DATE = '20140106'; 

SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) 
    DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY a.object_id) - 1, @MinDate) 
FROM  
    sys.all_objects a 
CROSS JOIN 
    sys.all_objects b 

は今、私はこのような結果セットを得ました:

--------------------------- 
|  AllDates   | 
--------------------------- 
| 2017-05-12 00:00:00.000 | 
| 2017-05-13 00:00:00.000 | 
| 2017-05-14 00:00:00.000 | 
| 2017-05-15 00:00:00.000 | 
| 2018-08-10 00:00:00.000 | 
| 2018-08-11 00:00:00.000 | 
| 2018-08-12 00:00:00.000 | 
| 2018-08-13 00:00:00.000 | 
| 2019-02-12 00:00:00.000 | 
| 2019-02-13 00:00:00.000 | 
--------------------------- 

SQL Serverでユーザー定義関数を使用しないと、これはセットベースのアプローチを使用することによってのみ達成できますか?

答えて

1

以下のリンクをご覧ください:これは、元のと同じロジックを適用

;WITH Tally AS (
    SELECT TOP 365 ROW_NUMBER() OVER (ORDER BY a.object_id) - 1 AS rn 
    FROM sys.all_objects a 
    CROSS JOIN sys.all_objects b 
) 
SELECT StartDate, EndDate, 
     DATEADD(DAY, t.rn, StartDate) AS AllDates 
FROM mytable 
CROSS APPLY (SELECT DATEDIFF(DAY, StartDate, EndDate) + 1) AS c(days) 
JOIN Tally AS t ON t.rn + 1 <= c.days 
ORDER BY StartDate, AllDates 

をあなたのテーブルに照会してください。

sys.all_objectsをクロス結合して返される行数の制限を使用する必要があります。そうしないと、クエリが非効率になります。 StartDateEndDateの差が常に1年未満の場合は、365を制限として使用できます。

0

あなたは今、私たちに日付を埋めるために、この集計テーブルを使用する集計テーブル

SELECT TOP 1000000 N=IDENTITY(INT, 1, 1) 
INTO dbo.Tally1K 
FROM master.dbo.syscolumns a CROSS JOIN master.dbo.syscolumns b; 

ALTER TABLE dbo.Tally1K ADD CONSTRAINT NBR_pk PRIMARY KEY(N); 

を充填するための以下のコードを使用することができ、以下のコードでは、このようなために

を集計テーブルを使用してください。タリーテーブルの詳細については

select DATEADD(DAY, t.N - 1, CONVERT(datetime, '02/25/2014')) 
from Tally1K t 
where t.N < DATEDIFF(DAY, '02/24/2014', '04/26/2014') + 1 
order by 1; 

あなたは、次のクエリを使用することができます

http://www.sqlservercentral.com/blogs/dwainsql/2014/03/27/tally-tables-in-t-sql/

関連する問題