2013-01-31 22 views
7

Tôi muốn lấy ngày mất tích giữa hai ngàyCTE ĐƯỜNG ĐI NGÀY GIỮA HAI NGÀY sử dụng SQL Server

nói @maxDate=2013-01-28

nói @curDate= GetDate()

Tôi đã viết CTE để làm điều này. Dưới đây là CTE của tôi:

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 

Kết quả của việc này là

Date 
2013-01-28 
2013-01-29 
2013-01-30 

nhưng tôi muốn

2013-01-29 
2013-01-30 

hãy giúp tôi ra

Cảm ơn trước

Trả lời

6

Thay đổi

select 1 as counter, @maxDate as Date 

để

select 1 as counter, DATEADD(day,1,@maxDate) as Date 

Để làm cho nó đơn giản hơn mặc dù thay đổi CTE

;with GetDates As 
( 
select DATEADD(day,1,@maxDate) as TheDate 
UNION ALL 
select DATEADD(day,1, TheDate) from GetDates 
where TheDate < @curDate 
) 
... 
+0

+1: Đánh bại tôi vào nó. –

0
DECLARE @STARTDATE  DATETIME; 
DECLARE @ENDDATE  DATETIME; 
DECLARE @STARTYEAR  INTEGER; 
DECLARE @YEARS   INTEGER; 

SET @STARTYEAR = 2017; 
SET @YEARS = 10; 

SELECT @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); 
Các vấn đề liên quan