嗨,我有一个问题,我需要知道第二天是否是假期。
我已经设置了一个临时表(稍后将成为表),因为我可能会添加其他工作日。
问题线
Holiday Datum (No column name)
0 2016-02-05 2016-02-05
这应该是因为第二天有一个1作为假期,所以无法弄清楚。我知道第二天检查一下,如果1是“当前日期”
Holiday Datum (No column name)
0 2016-02-05 2016-02-08
执行力
DECLARE @start DATE
SET @start = '2016-02-01'
DECLARE @end DATE
SET @end = '2016-02-10'
WHILE(@start<=@end)
BEGIN
DECLARE @Holiday TABLE (Datum DATE,Holiday bit)
INSERT INTO @Holiday
SELECT
@start,
(SELECT CASE
WHEN DATENAME(WEEKDAY,@start) IN ('Saturday','Sunday')
THEN 1
ELSE 0
END) AS Holiday
SET @start = DATEADD(d,1,@start)
END
SELECT * FROM @Holiday
SELECT h.Holiday,h.Datum,
(SELECT
CASE
WHEN DATEADD(d,1,h.Datum) = DATEADD(d,1,h.Datum) AND h.Holiday = 1
THEN (SELECT TOP 1 Datum FROM @Holiday WHERE Datum > h.Datum AND Holiday = 0 )
ELSE h.Datum
END)
FROM @Holiday h
方法1:
由于您正在为@Holiday
表生成值并且已对其进行排序,因此可以对两个表进行联接和排序,以便在第二天查看,如下所示:
SELECT t.h1Datum AS Datum ,
t.Holiday ,
t.IsNextDayAHoliday FROM(
SELECT ROW_NUMBER() OVER (PARTITION BY h1.Datum ORDER BY h1.Datum ASC) Nr,
h1.Datum h1Datum, h1.Holiday Holiday, h2.Holiday IsNextDayAHoliday
FROM @Holiday h1 LEFT JOIN @Holiday h2 ON h1.Datum < h2.Datum
) t WHERE nr = 1
结果是这样的:
Datum Holiday IsNextDayAHoliday
2016-02-01 0 0
2016-02-02 0 0
2016-02-03 0 0
2016-02-04 0 0
2016-02-05 0 1
2016-02-06 1 1
2016-02-07 1 0
2016-02-08 0 0
2016-02-09 0 0
2016-02-10 0 NULL
如您所见,最后一天为空,因为它不包含在@Holiday
表中。
方法二:
另一种方法是使用CROSS APPLY
该函数来计算假期是什么:
SELECT Datum ,
Holiday,
IsHolidayCalc.IsNextDayAHoliday
FROM @Holiday
CROSS APPLY (SELECT IIF(DATENAME(WEEKDAY, DATEADD(DAY, 1, Datum)) IN ('Saturday','Sunday'), 1, 0) IsNextDayHoliday) IsHolidayCalc
现在,结果没有NULL可以处理:
Datum Holiday IsNextDayHoliday
2016-02-01 0 0
2016-02-02 0 0
2016-02-03 0 0
2016-02-04 0 0
2016-02-05 0 1
2016-02-06 1 1
2016-02-07 1 0
2016-02-08 0 0
2016-02-09 0 0
2016-02-10 0 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句