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