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

时间:2015-01-05 14:32:09

标签: tsql sql-server-2008-r2 dateadd datepart

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

例如,本月第一天发生的交易将在第二天发布到会计系统,而在该月的最后一天发生的交易将在下列第一天发布到会计系统一个月。

因此,通常情况下我可以记录10月份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日之后的第一个工作日。

2 个答案:

答案 0 :(得分:1)

我建议您从脚本中生成Date表 Create and Populate at Date Dimension for Data Warehouse并用它来确定下一个工作日的时间。出于我自己的目的,我放弃了所有英国专栏和财政专栏 - 虽然它们对你有用。您也可以添加自己的假期,并直接加入查询而不是创建特定的函数。

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

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

答案 1 :(得分:1)

这里有几点需要考虑:

使用

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独立)。您还可以轻松填充公共假期并将其考虑在内。有许多脚本可以填充日期维度表,例如:

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