【问题标题】:SQL - get specific dates based on working weekSQL - 根据工作周获取特定日期
【发布时间】:2015-01-05 14:32:09
【问题描述】:

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

例如,每月 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 日之后获得第一个工作日。

【问题讨论】:

  • 如果可以选择,您可能需要考虑添加一个通过触发器填充的新元数据列,然后从该列中查询。似乎有比您意识到的更多的业务逻辑在起作用。假期有问题吗?
  • @LynnCrumbling:是的,我刚刚被提醒假期确实会成为一个问题,因此必须考虑检查日期是否也在假期表中......
  • 我几乎可以向您保证,总有一天,其他人也需要根据 Post_Date 进行查询。这真的感觉像是一个额外的列,应该由应用程序填充,或者由在行插入/更新时运行的触发器填充。
  • @LynnCrumbling:这是针对 SSRS 报告的,所以我会为用户提供输入日期范围的选项,但如果他们不输入日期范围(例如,用于计划执行) 那么它总是从第一个工作日之后的第一个工作日到下个月的第一个工作日的月份数据

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


【解决方案1】:

我建议您从脚本生成日期表 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

【讨论】:

  • 这本质上是一个仅链接的答案;您要求 OP 用作解决方案的大部分内容都在另一个网站上。
  • 谢谢丹尼尔,我取出了所有美国假期的专栏和日期,它完成了工作......
【解决方案2】:

这里有几点需要考虑:

使用线

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多