我想在两个日期之间获取缺少的日期
说@maxDate = '2013-01-28'
说@curDate = GetDate()
我写过CTE来做这件事。这是我的CTE:
create procedure EmpDate
as begin
declare @curDate Date
set @curDate = GETDATE()
declare @maxDate Date
select @maxDate = MAX(EmpAttendance.Sdate)
from EmpAttendance
;with GetDates As
(
select 1 as counter, @maxDate as Date
UNION ALL
select counter + 1, DATEADD(day,counter,@maxDate)
from GetDates
where DATEADD(day, counter, @maxDate) < @curDate
)
select Date from GetDates
end
go
结果是
Date
2013-01-28
2013-01-29
2013-01-30
但我想要
2013-01-29
2013-01-30
请帮帮我。
答案 0 :(得分:9)
更改
select 1 as counter, @maxDate as Date
到
select 1 as counter, DATEADD(day,1,@maxDate) as Date
尽管改变CTE使其更简单
;with GetDates As
(
select DATEADD(day,1,@maxDate) as TheDate
UNION ALL
select DATEADD(day,1, TheDate) from GetDates
where TheDate < @curDate
)
...
答案 1 :(得分:2)
DECLARE @STARTDATE DATETIME;
DECLARE @ENDDATE DATETIME;
DECLARE @YEARS INTEGER;
SET @YEARS = 10;
SET @STARTDATE = '20170101';
SELECT @ENDDATE = DATEADD(DAY,-1,DATEADD(YEAR,@YEARS,@STARTDATE));
DECLARE @FirstDayOfWeek INTEGER;
SET @FirstDayOfWeek = 6;
;WITH CTE_DATES
AS
(
SELECT @STARTDATE AS [DATE],
1 AS [Level]
UNION ALL
SELECT
DATEADD(DAY,1, [DATE] ) , [Level] + 1
FROM CTE_DATES
WHERE [DATE] < @ENDDATE
)
SELECT
[DATE],
DATENAME(dw,[Date]) AS Daynamelong,
LEFT(DATENAME(dw,[Date]),3) AS DaynameShort,
DATEPART(dw,[Date]) AS NaturalDayNumber,
CASE WHEN DATEPART(dw,[Date]) >= @FirstDayOfWeek THEN (DATEPART(dw,[Date]) - (@FirstDayOfWeek)) +1
ELSE
((DATEPART(dw,[Date]) - (@FirstDayOfWeek)) +1) + 7
END AS SpecialDayNumber,
[Level]
FROM
CTE_DATES
ORDER BY
[DATE] ASC
OPTION (MAXRECURSION 5000);