在我的SQL where子句中需要动态日期

时间:2018-06-20 17:34:32

标签: sql sql-server date

我需要在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())  

4 个答案:

答案 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。该链接对您有用。

TSQL loop months in sequence

答案 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)`