2017-12-21 16 views
-2

가 기준 날짜를 감안할 때 날짜를 주어, 나는 달 말까지 다음 영업일, 다음 주말, 다음 주 업무 일 기간 및 일을 계산하려면 원하는 항목계산 기간

next business day -> 22-12-2017/22-12-2017 
next weekend -> 23-12-2017/24-12-2017 
next week business days->25-12-2017/29-12-2017 
days until end of month ->22-12-2017/31-12-2017 

어떻게해야합니까? 나는 이미 일정 테이블이 있지만 각 열

달력 테이블 달력 테이블을 사용하는 방법에 대한이

Date  DayOfWeek MonthStartDate MonthEndDate MonthLength IsWeekend 
2017-12-21 4   2017-12-01  2017-12-31 31   0 
+0

캘린더 테이블은 매우 쉬워야합니다. 캘린더 테이블의 모습을 보여줄 수 있습니까? – Squirrel

+1

어떤 SQL Server 버전을 사용하고 있습니까? ['EOMONTH'] (https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql)와 같은 기능이 유용 할 수 있습니다. – HABO

+0

캘린더 테이블이 어떻게 보이는지 편집했습니다. 저는 SQL Server 2016에 있습니다. –

답변

0

이 내 달력 테이블을 사용 쉬울 것입니다, 당신 달력 테이블에 week no를 추가 할 수 있습니다 나는 당신이 당신의 일부를 올리기 전에 일하기 시작했다.

내가 알아챈 한 가지는 "다음 주 영업일"이지만 20171225 - 20171229이 맞습니까? 25 일은 크리스마스입니다 (많은 곳에서 그 날을 비즈니스 데이로 간주하지는 않습니다).

어떤 방법, 당신은 당신의 달력 테이블 편집해야하지만이 작동하는지 알려 드리겠습니다 :

DECLARE @Date Date = '20171221' 

SELECT TOP 1 
     FIRST_VALUE([date]) OVER (ORDER BY DD.[Working Day] DESC, DD.Date) AS NextWorkingDay, 
     FIRST_VALUE([date]) OVER (ORDER BY CASE [Day Name] WHEN 'Saturday' THEN 0 ELSE 1 END ASC, DD.Date) AS WeekendStart, 
     DATEADD(DAY, 1,FIRST_VALUE([date]) OVER (ORDER BY CASE [Day Name] WHEN 'Saturday' THEN 0 ELSE 1 END ASC, DD.Date)) AS WeekendEnd, 
     FIRST_VALUE([date]) OVER (ORDER BY CASE [Day Name] WHEN 'Monday' THEN 0 ELSE 1 END ASC, DD.Date) AS NextWeekStart, 
     DATEADD(DAY, 4,FIRST_VALUE([date]) OVER (ORDER BY CASE [Day Name] WHEN 'Monday' THEN 0 ELSE 1 END ASC, DD.Date)) AS NextWeekEnd, 
     DATEADD(Day, 1, @Date) AS EndStart, 
     DATEADD(DAY, -1, (DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date)+1, 0))) AS MonthEnd 
FROM DimDate DD 
WHERE DD.Date > @Date; 

당신이 당신의 달력 표에서 일 이름이없는 알 수 있습니다. 나는 이것을 추가하는 것이 좋습니다. 그렇지 않으면 내 참조를 [Day Name] ~ DATENAME(WEEKDAY,[Date])으로 변경해야 성능이 저하됩니다.

+0

25 번째와 26 번째는 여기에 휴일이지만, 계속 유지하려고 노력하고있었습니다. 아이디어를 얻은 것 같습니다. –

+0

12 월 25 일은 북쪽의 휴일이 아닙니다. 폴. 네가 '산타'라고 믿지 않는다면 – Squirrel

0

예처럼 보이는위한 부속 선택을 사용하지 않고 이러한 작업을 수행하는 방법을 모르는

select top 1 next_business_day = [Date] 
from calendar 
where [Date] > '2017-12-21' 
order by [Date] 

select top 2 next_weekend = [Date] 
from calendar 
where [Date]  > '2017-12-21' 
and  IsWeekend = 1 
order by [Date] 

next week business days를 들어, 당신은 그것을