11

我想获取两个日期之间的缺失日期

@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   

请帮帮我。

4

2 回答 2

11

改变

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  
)
... 
于 2013-01-31T13:52:11.627 回答
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);
于 2017-03-31T11:25:22.710 回答