Tsql SQL-根据工作周获取特定日期

Tsql SQL-根据工作周获取特定日期,tsql,sql-server-2008-r2,dateadd,datepart,Tsql,Sql Server 2008 R2,Dateadd,Datepart,我们需要确定提取数据的具体日期 例如,在本月1日发生的交易在2日过账到会计系统,在本月最后一天发生的交易在下个月1日过账到会计系统 因此,通常我可以只提取10月份的所有记录,现在我需要提取日期介于10月2日和11月2日之前的记录 我有下面的代码来获取最早的日期(不管是不是周末,因为在这种情况下,记录将显示周末后第一个工作日的发布日期): 现在我需要检查11月1日是否是周末,如果是,请使用下周一的日期 我已启动以下代码,但无法使其正常工作: Declare @LatestDate datetime

我们需要确定提取数据的具体日期

例如,在本月1日发生的交易在2日过账到会计系统,在本月最后一天发生的交易在下个月1日过账到会计系统

因此,通常我可以只提取10月份的所有记录,现在我需要提取日期介于10月2日和11月2日之前的记录

我有下面的代码来获取最早的日期(不管是不是周末,因为在这种情况下,记录将显示周末后第一个工作日的发布日期):

现在我需要检查11月1日是否是周末,如果是,请使用下周一的日期

我已启动以下代码,但无法使其正常工作:

Declare @LatestDate datetime

set @LatestDate = '01/11/2014'

if datepart(dw,@LatestDate) in (1,7)
Begin
    set @LatestDate = DATEADD(d,1,@LatestDate ) 
End

你能告诉我哪里出了问题吗?理想情况下,无论是哪一年,它都应该全年工作,总是在月1日之后的第一个工作日工作。

我建议您在 然后用它来计算下一个工作日是什么时候。出于我自己的目的,我删除了所有英国专栏和财政专栏——尽管它们可能对你有用。您也可以添加自己的假期,并直接加入查询,而不是创建特定的函数

然后您可以执行以下操作:

DECLARE @LatestDate date

SET @LatestDate = '01/11/2014'

SELECT @LatestDate = MIN([Date]) FROM DimDate
WHERE [Date] >= @LatestDate
AND IsWeekday = 1 AND IsHoliday = 0

PRINT @LatestDate

这里有一些事情需要考虑:

用电话

Set Dateformat dmy;
确保到日期的字符串转换为正确的日期格式(在本例中为非美国格式)

确保(1,7)是特定服务器的正确周末日期。您可以通过运行以下命令进行测试:

Select @@Datefirst
它会告诉你一周中的哪一天是第一天。默认值为7(星期日),适用于下面的示例。如有必要,您可以更改此设置:

如果计划将代码移植到另一台服务器,则需要注意这一点

您的代码应为星期天添加1,为星期六添加2:

-- Saturday
if datepart(dw,@LatestDate) = (1)
    set @LatestDate = DATEADD(dd,1,@LatestDate);

-- Sunday
if datepart(dw,@LatestDate) = (7)
    set @LatestDate = DATEADD(dd,2,@LatestDate);
使用日期维度,在增加一点初始开销的同时,更容易、更高效、更健壮(即独立于日期优先)。您还可以轻松填充公共假日并将其考虑在内。有许多脚本用于填充日期维度表,例如:


如果是一个选项,您可能需要考虑添加一个通过触发器填充的新元数据列,然后只需查询该列。似乎有比你意识到的更多的业务逻辑在起作用。“假期是个问题吗?”林肯说:“是的,我刚刚被提醒过,假期确实是个问题,所以我们必须考虑一下日期是否在节假日表中……我几乎可以保证,有一天,还有人会根据邮递日期查询。”这真的像是应用程序或行插入/更新时运行的触发器应填写的附加列。@LynnCrumbling:这是用于SSRS报告的,因此我将为用户提供键入日期范围的选项,但如果他们不输入日期范围(例如,用于计划执行)那么它将始终是从第一个月后的第一个工作日到下一个月的第一个工作日的月份数据。这基本上是一个仅链接的答案;你要求OP用作解决方案的大部分内容都在另一个网站上。谢谢Daniel,我拿出了所有的美国假期专栏和日期,它完成了这项工作。。。
-- Saturday
if datepart(dw,@LatestDate) = (1)
    set @LatestDate = DATEADD(dd,1,@LatestDate);

-- Sunday
if datepart(dw,@LatestDate) = (7)
    set @LatestDate = DATEADD(dd,2,@LatestDate);