Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的SQL where子句中需要动态日期_Sql_Sql Server_Date - Fatal编程技术网

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

我的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日运行时,它需要

我需要在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 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硬编码来验证。我让它变得很难。谢谢你的指导!