我需要在SQL Server 2012中编写一个(我的第一个)简单的存储过程,该过程将在每月的1号运行。每次运行时,数据都必须是最近3个月的数据。
我需要WHERE
子句基于table.STARTDATE
,该子句介于最近3个月的日期之间。
因此,当它在7月1日运行时,它必须是:
WHERE t.STARTDATE BETWEEN '2018-04-01' AND '2018-06-30'
,并且在8月1日运行时,它必须是:
WHERE t.STARTDATE BETWEEN '2018-05-01' AND '2018-07-31'
以此类推。
好的,我只是尝试了一下,直到本月的最后一天才真正验证它。这行得通吗?
BETWEEN DATEADD(m, -3, GETDATE()) AND DATEADD(dd, -1, GETDATE())
答案 0 :(得分:1)
您正确安装了它(假设时间代码无关紧要)。
就像做一个FYI一样,您必须记住可以将日期强制放入代码中进行测试。
因此:
SELECT dateadd(m,-3,'08/01/2018'), dateadd(dd,-1,'08/01/2018')
SELECT dateadd(m,-3,'07/01/2018'), dateadd(dd,-1,'07/01/2018')
将在7月1日和8月1日(您的理论日期)对其进行测试
答案 1 :(得分:1)
执行此操作的一种方法是使用CTE。该链接对您有用。
答案 2 :(得分:1)
我想你想要
where t.STARTDATE >= dateadd(month, -3, datefromparts(year(getdate()), month(getdate()),
1)) and
t.STARTDATE < datefromparts(year(getdate()), month(getdate()), 1)
由于某些原因,您不习惯使用带有日期的between
,因此,请转至Aaron Bertrand的博客What do between and the devil have in common?
答案 3 :(得分:1)
您可以通过定义日期来完成,这里getdate()
将是您的table.STARTDATE
declare @myStartdate date=dateadd(MM, -3,getdate())
declare @myEnddate date=dateadd(MM, -1,getdate())
SELECT getdate() as today, CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@myStartdate)-1),@myStartdate),101) AS Date_start_Value,
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@myEnddate))),
DATEADD(mm,1,@myEnddate)),101) as date_end_value
这将返回
today Date_start_Value date_end_value
2018-06-20 21:34:07.180 03/01/2018 05/31/2018
现在您可以在where子句中使用以上
WHERE t.STARTDATE BETWEEN
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@myStartdate)-1),@myStartdate),101)
AND
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@myEnddate))),
DATEADD(mm,1,@myEnddate)),101)`