我的SQL where子句中需要动态日期
我需要在SQLServer2012中编写一个(我的第一个)简单的存储过程,它将在每个月1日运行。每次运行时,数据必须是过去3个月的完整数据 我需要我的SQL where子句中需要动态日期,sql,sql-server,date,Sql,Sql Server,Date,我需要在SQLServer2012中编写一个(我的第一个)简单的存储过程,它将在每个月1日运行。每次运行时,数据必须是过去3个月的完整数据 我需要WHERE子句基于过去3个月日期之间的表.STARTDATE 因此,当它在7月1日运行时,需要: WHERE t.STARTDATE BETWEEN '2018-04-01' AND '2018-06-30' WHERE t.STARTDATE BETWEEN '2018-05-01' AND '2018-07-31' 当它在8月1日运行时,它需要
WHERE
子句基于过去3个月日期之间的表.STARTDATE
因此,当它在7月1日运行时,需要:
WHERE t.STARTDATE BETWEEN '2018-04-01' AND '2018-06-30'
WHERE t.STARTDATE BETWEEN '2018-05-01' AND '2018-07-31'
当它在8月1日运行时,它需要:
WHERE t.STARTDATE BETWEEN '2018-04-01' AND '2018-06-30'
WHERE t.STARTDATE BETWEEN '2018-05-01' AND '2018-07-31'
等等
好的,我刚刚试过这个,直到这个月的最后一天才能真正验证它。这样行吗
BETWEEN DATEADD(m, -3, GETDATE()) AND DATEADD(dd, -1, GETDATE())
您的答案是正确的(假设时间代码无关紧要)
在做这类事情时,作为参考,您必须记住,您可以在代码中强制输入日期来测试它
因此:
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日(你的理论日期)进行测试。你的测试是正确的(假设时间代码不重要)
在做这类事情时,作为参考,您必须记住,您可以在代码中强制输入日期来测试它
因此:
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日(你的理论日期)进行测试。一种方法是使用CTE。此链接将对您有用
一种方法是使用CTE。此链接将对您有用 我想你想要:
where t.STARTDATE >= dateadd(month, -3, datefromparts(year(getdate()), month(getdate()),
1)) and
t.STARTDATE < datefromparts(year(getdate()), month(getdate()), 1)
其中t.STARTDATE>=dateadd(月,-3,datefromparts(年(getdate()),月(getdate()),
1) )及
t、 STARTDATE
出于您不应该养成在日期之间使用的习惯的原因,我建议您访问Aaron Bertrand的博客,我想您需要:
where t.STARTDATE >= dateadd(month, -3, datefromparts(year(getdate()), month(getdate()),
1)) and
t.STARTDATE < datefromparts(year(getdate()), month(getdate()), 1)
其中t.STARTDATE>=dateadd(月,-3,datefromparts(年(getdate()),月(getdate()),
1) )及
t、 STARTDATE
出于您不应该养成在日期之间使用的习惯的原因,我建议您访问Aaron Bertrand的博客,您可以通过定义日期来实现,这里getdate()
将是您的表。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)`
您可以通过定义日期来完成,这里的getdate()
将是您的表
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)`
你说得对,这确实有效!我忘了当它运行我的-1将是第一个。所以我不得不用4-19而不是4-1硬编码来验证。我让它变得很难。谢谢你的指导!你说得对,这确实有效!我忘了当它运行我的-1将是第一个。所以我不得不用4-19而不是4-1硬编码来验证。我让它变得很难。谢谢你的指导!