SQL 服务器:加入日期范围 select

SQL Server : join date range in select

我select编辑了一些数据,例如

Select startDate(01.09.19), endDate(30.09.19) 
from DataTable

而且我必须转换此 select 就像如果我收到一行开始日期为 01.12.2019 和结束日期为 31.12.2019,我应该制作 31 行:每一行都包含此中的下一个日期日期范围。

上面定义的行应转换为

StartDate:01.12.2019, EndDate:31.12.2019, Day:01.12.2019;
StartDate:01.12.2019, EndDate:31.12.2019, Day:02.12.2019;
... 
StartDate:01.12.2019, EndDate:31.12.2019, Day:31.12.2019;

我怎样才能一次完成这个 select?

CTE 是您问题的完美解决方案。

DECLARE @StartDate DATE = '20190901' 
DECLARE @EndDate DATE = '20190930'

;
WITH A (StartDate, EnDate, [Date])
AS
(
  SELECT @StartDate, @EndDate, @StartDate
  UNION ALL
  SELECT @StartDate,@EndDate,(DATEADD(dd,1,[Date]))
  FROM A
  WHERE [Date] < @EndDate
)

SELECT *  FROM A ORDER BY [Date]--this should return you 30 records

如果您没有日历 Table 或数字 Table,这是另一种选择,您可以使用临时计数 table

例子

Declare @YourTable table (startDate date,endDate date)
Insert Into @YourTable values
('2019-01-01','2019-12-31')


Select A.*
      ,NewValue = DateAdd(DAY,N-1,startDate)
 From  @YourTable A
 Cross Apply (  Select Top (datediff(day,startDate,endDate)+1) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2 ) B

Returns

startDate   endDate     NewValue
2019-01-01  2019-12-31  2019-01-01
2019-01-01  2019-12-31  2019-01-02
2019-01-01  2019-12-31  2019-01-03
2019-01-01  2019-12-31  2019-01-04
...
2019-01-01  2019-12-31  2019-12-31

Check/Try这个-

DECLARE @date DATE='20191201';

;WITH N(N)AS 
(SELECT 1 FROM(VALUES(1),(1),(1),(1),(1),(1))M(N)),
tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N,N a)
SELECT top(day(EOMONTH(@date)))
  N day,
  dateadd(d,N-1, @date) AS DATES,
  CAST(DATEADD(month, DATEDIFF(month, 0, @date), 0) AS DATE) AS [START_DATE],
  EOMONTH(@date) AS END_DATE
FROM tally