【发布时间】: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