【发布时间】:2014-05-23 23:45:13
【问题描述】:
我希望有人可以帮助我解决这个问题。我把简单的例子放在下面: 出于计费目的,我需要跳过节假日和周末来为计费日期设置正确的到期日。 我有一张假期表,其中包含公司的所有假期(可能包含一些周末,例如周六——现在不太确定,因为某些公司,例如银行,我们暂时不能考虑特殊情况)。
我需要找出数据库中的连续假期加上连续周末。
以数据库中的假日数据为例:
EXCP_DATE ID
----------- ---------- -------------------- ----------
3/29/2013 1
4/1/2013 1
12/9/2013 1
12/10/2013 1
12/25/2013 1
12/26/2013 1
12/27/2013 1
12/28/2013 1
我需要“发生”列下的假期和周末数。连续假期/周末 my CONSECUTIVE_DAY: 1 表示该日期有连续的假期/周末
ID EXCP_DATE WeekDay CONSECUTIVE_DAY OCCURENCES
1 3/29/2013 FRIDAY 1 3
2 4/1/2013 MONDAY 0 1
3 12/9/2013 MONDAY 1 2
4 12/10/2013 TUESDAY 0 1
5 12/25/2013 WEDNESDAY 1 5
6 12/26/2013 THURSDAY 1 4
7 12/27/2013 FRIDAY 1 3
8 12/28/2013 SATURDAY 1 2
以下是适用于大多数情况的查询。只有连续2个以上的假期才会失败,因为它只领先一步。
SELECT A.*
,CASE
WHEN CONSECUTIVE_DAY = 1
THEN CASE
WHEN upper(datename(weekday, EXCP_DATE)) = 'FRIDAY'
AND LEAD(EXCP_DATE) OVER (
ORDER BY EXCP_DATE
) = (EXCP_DATE + 3)
THEN DATEdiff(dd, EXCP_DATE, LEAD(EXCP_DATE) OVER (
ORDER BY EXCP_DATE
)) + 1
WHEN upper(datename(weekday, EXCP_DATE)) = 'FRIDAY'
AND LEAD(EXCP_DATE) OVER (
ORDER BY EXCP_DATE
) <> (EXCP_DATE + 3)
THEN 3
ELSE DATEdiff(dd, EXCP_DATE, LEAD(EXCP_DATE) OVER (
ORDER BY EXCP_DATE
)) + 1
END
ELSE CONSECUTIVE_DAY
END OCCURENCES
FROM (
SELECT T.*
,upper(datename(weekday, EXCP_DATE)) WeekDay
,Lead(EXCP_DATE, 1, EXCP_DATE) OVER (
ORDER BY EXCP_DATE
) Lead
,EXCP_DATE + 1 [EXCP_DATE + 1]
,EXCP_DATE + 3 [EXCP_DATE +3]
,datename(weekday, EXCP_DATE + 3) [DateName_EXCP_DATE +3]
,
---------------------------
CASE
WHEN Lead(EXCP_DATE, 1, EXCP_DATE) OVER (
ORDER BY EXCP_DATE
) = EXCP_DATE + 1
THEN 1
WHEN upper(datename(weekday, EXCP_DATE)) = 'FRIDAY'
AND LEAD(EXCP_DATE) OVER (
ORDER BY EXCP_DATE
) = EXCP_DATE + 3
THEN 1
WHEN upper(datename(weekday, EXCP_DATE)) = 'SATURDAY'
AND LEAD(EXCP_DATE) OVER (
ORDER BY EXCP_DATE
) = EXCP_DATE + 2
THEN 1
ELSE 0
END CONSECUTIVE_DAY
FROM TEST1 T
) A
------------------------------------数字 5 和 6 不正确。如何在 Lead 上进行递归?
结果:
ID EXCP_DATE WeekDay Lead EXCP_DATE + 1 EXCP_DATE +3 DateName_EXCP_DATE +3 CONSECUTIVE_DAY OCCURENCES
1 3/29/2013 FRIDAY 4/1/2013 3/30/2013 4/1/2013 Monday 1 4
2 4/1/2013 MONDAY 12/9/2013 4/2/2013 4/4/2013 Thursday 0 0
3 12/9/2013 MONDAY 12/10/2013 12/10/2013 12/12/2013 Thursday 1 2
4 12/10/2013 TUESDAY 12/25/2013 12/11/2013 12/13/2013 Friday 0 0
5 12/25/2013 WEDNESDAY 12/26/2013 12/26/2013 12/28/2013 Saturday 1 2
6 12/26/2013 THURSDAY 12/27/2013 12/27/2013 12/29/2013 Sunday 1 2
8 12/27/2013 FRIDAY 12/28/2013 12/28/2013 12/30/2013 Monday 1 3
7 12/28/2013 SATURDAY 12/28/2013 12/29/2013 12/31/2013 Tuesday 0 0
感谢您的帮助。
【问题讨论】:
-
你希望别人如何阅读和理解这个?请适当地格式化帖子。
-
我添加了 sql-server 标签,因为代码看起来像 SQL Server(以及 2012+ 版本)。
标签: sql sql-server