2017-10-08 48 views
1

我能夠通過此獲得兩個日期之間的所有日期。使用基於集合的方法在SQL Server中的多個兩個日期之間打印所有日期的日期

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 

現在,我得到一個結果集是這樣的:

----------------------------------------------------------- 
| 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 | 
----------------------------------------------------------- 

我需要找到所有天都開始日期和結束日期在此表中,與預期的結果應該像下面:

--------------------------- 
|  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之間的差異總是小於一年,則可以使用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/

相關問題