我有一个名为 DateView 的视图,它充当日历。结构如下:
Date | Date_Previous | Date_Following | Weekday
20170314 | 20170313 | 20170315 | Tu
... | ... | ... | ...
我有一个给定的日期和(在此视图的帮助下)需要从给定日期减去两天而忽略星期六和星期日。
我目前的测试日期20170314的方法如下:
SELECT TOP 2 Date
FROM DateView d
WHERE d.Weekday NOT IN ('Sa', 'So')
AND d.Date < '20170314'
ORDER BY d.Date DESC
结果如下:
Date
2017-03-13
2017-03-10
但是,我只需要获得第二行,即2017-03-10。因此,我尝试通过将ORDER BY d.Date DESC
更改为ORDER BY d.date ASC
来反转排序顺序,但这会产生以下结果,因为视图从1990-01-01开始:
Date
1990-01-01
1990-01-02
如何从上面显示的第一个结果中选择第二行?理想情况下,解决方案不包括ROW_NUMBER() over (order by ...)
答案 0 :(得分:1)
怎么样: -
Select min(Date) from
(SELECT TOP 2 Date
FROM DateView d
WHERE d.Weekday NOT IN ('Sa', 'So')
AND d.Date < '20170314'
ORDER BY d.Date DESC);
答案 1 :(得分:0)
当您需要考虑SUN和SAT时,2天非常简单。您可以在没有DateView
的情况下实现目标:
DECLARE @Date DATETIME = '2017-03-14'
SELECT DATEADD(day,
CASE DATENAME(weekday, @Date)
WHEN 'TUESDAY' THEN -4
WHEN 'WEDNESDAY' THEN -4
WHEN 'SUNDAY' THEN -3
ELSE -2
END, @Date) AS TwoBusinessDaysSubstractedDate
我还可以提供一个更通用的解决方案,接受超过7天的范围,并考虑法定假日和周末。