1

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

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

因此,虽然通常我可以只提取 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 日之后获得第一个工作日。

4

2 回答 2

1

我建议您从在数据仓库的日期维度创建和填充的脚本中生成日期表, 并使用它来确定下一个工作日是什么时候。出于我自己的目的,我删除了所有 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
于 2015-01-05T15:05:35.623 回答
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

于 2015-01-05T17:55:14.860 回答