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

SQL - get specific dates based on working week

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

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

因此,虽然通常我只能获取 10 月份的所有记录,但现在我需要提取日期介于 10 月 2 日和 11 月 2 日之间的记录。

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

Declare @EarliestDate varchar(8), @SQL NVARCHAR(1000), @sDate varchar(8)

-- get data for the last 3 months
SET @EarliestDate= CAST(DATEPART(YEAR,DATEADD(m,-3, getdate())) AS VARCHAR(4)) 
    + RIGHT('00' + CAST(DATEPART(mm, DATEADD(m,-2, getdate())) AS varchar(2)), 2)+ '02' 

现在我需要检查 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 号之后的第一个工作日。

我建议您从脚本中生成日期 table Create and Populate at Date Dimension for Data Warehouse 并用它来计算下一个工作日的时间。出于我自己的目的,我删除了所有 UK 列和 Fiscal 列 - 尽管它们可能对您有用。您也可以添加自己的假期,直接加入查询而不是创建特定函数。

那么您只需执行以下操作即可:

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(星期日),适用于以下示例。如有必要,您可以更改此设置:

http://msdn.microsoft.com/en-gb/library/ms181598.aspx

如果您打算将代码移植到另一台服务器,则需要注意这一点。

您的代码应该为星期日加 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);

使用日期维度,同时增加一点初始开销更容易、更高效,也更健壮(即 @@Datefirst 独立)。您还可以轻松填充 public 个假期并将其考虑在内。有许多脚本可以填充日期维度 table,例如:

http://www.codeproject.com/Articles/647950/Create-and-Populate-Date-Dimension-for-Data-Wareho