我有一张日历表。我想在今天的日期之前获得2个业务,同时跳过假期和周末。
例如:
示例1:2013年新年是星期二。如果是星期四(1/3),那么我的开始日期是星期一(12/31)。
示例2:如果是星期一(12/31),那么我的开始日期是星期四(12/27)。
我的Clandar表预先填充了30年的日期,并有标志来确定哪些是周末和假日。该表包含以下字段:
dt:30年的日期和时间 Y:年 D:日 M:月 Isholiday :(假期不是,标有0表示“否”,1表示“是”) IsWeekday :(是工作日吗?标记为0表示“否”,1表示“是” HolidayDescritption:假日名称
请帮忙。
答案 0 :(得分:1)
这就是你想要的:
select top 1 *
from ( select *
from Calendar
where IsHoliday = 0
and IsWeekday = 1
and dt between DateAdd( Day, -6, GetDate ) and GetDate()
) tmpCalendar
where dt <= DateAdd( Day, -2, GetDate() )
order by dt desc
确保仅使用您想要的字段替换*
。
答案 1 :(得分:1)
试试这个:
SELECT dt FROM
(
SELECT dt, ROW_NUMBER() OVER (ORDER BY dt DESC) AS R
FROM
Calendar
WHERE
IsHoliday = 0
AND IsWeekday = 1
AND dt < GETDATE()
) T
WHERE R = 2