借助视图从日期中减去两天,忽略周末

时间:2017-03-14 09:22:06

标签: sql tsql date

我有一个名为 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 ...)

2 个答案:

答案 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天的范围,并考虑法定假日和周末。