【发布时间】:2018-10-18 08:31:05
【问题描述】:
我正在使用以下情况条件来计算 StartDate 变量:
DECLARE @StartDate Date =
DATEADD(DAY, CASE WHEN DATEPART(dw, GETDATE()) = 2 THEN -10 ELSE -8 END, GETDATE())
如您所见,如果今天的日期是星期一,则从今天的日期中减去 10 天,否则将减去 8 天。由于今天(2018 年 10 月 16 日)不是星期一,这将返回 10/8/2018 作为输出(扣除 8 天)。如果在星期一 (10/15) 执行,则 @StartDate 将返回 10/5 作为输出。
我添加了一个名为 Holidays 的表,它有两列 Holiday Name 和 Date 包含今年的三条记录:哥伦布日:10/8、退伍军人节 11/12 和感恩节 11/22。
现在我要做的具有挑战性的部分是,如果 @StartDate 的返回输出是 10/8(今天执行的查询:10/16),这是一个假期(星期一),那么 @StartDate 的值应该是更改为 10/5(前一个工作日,周六和周日除外)。另外如果@StartDate的值为10/5(查询于10/15执行),则该值应改为10/4,因为10/8是假期,不计入10天的扣减所以应该是 10/4 而不是 10/5。
所以理论上它应该这样工作:检查今天日期和@StartDate之间是否有任何假期,如果有,则使用前一天并根据我上面提到的情况相应地调整星期一。
请注意,我在顶部提到的包含语句是存储过程的一部分。
我怎样才能完成这项工作,有人可以帮忙吗?提前致谢。
【问题讨论】:
-
这只是过程的开始吗?将来您可能会一个接一个地有多个假期,还是只有一天?
-
Just use a calendar table of 所有的日子,而不仅仅是假期,并适当地标记它们。将所有这些逻辑构建到查询中,您将忽略异常(例如两天假期,周一假期),具有不同
DATEFIRST的人将运行该代码并得到错误结果等. 这个问题已经解决了;不要重新解决它。 -
提示:
( @@DateFirst + DatePart( weekday, SampleDate ) - 1 ) % 7 + 1将始终返回一个从1到7的整数,其中1对应于星期日,无论DateFirst或Language的设置如何。不要指望多次调用GetDate()返回相同的值,捕获一次,例如declare @Today as Date = Cast( GetDate() as Date);,并使用该值。
标签: sql sql-server tsql stored-procedures