自动查询每个月

时间:2018-06-06 08:29:10

标签: sql-server tsql date

我的查询如下:

select a.ID, 
       a.Date_Reported, 
       b.Date_Received
from tx_ext a 
join tx b on b.id = a.id
AND b.Date_Reported >= convert( datetime, '2018-05-01' ) 
AND b.Date_Reported <= convert( datetime, '2018-05-31' )

如您所见,我目前正在手动设置五月(上个月)的日期。如何更改我的查询,无论我在哪个月,我总是在上个月运行。所以例如这个月是六月,所以我想从五月开始运行价值。下个月是7月,所以我想跑6月。

我想自动执行此操作,因此我不需要每月手动输入日期

感谢

2 个答案:

答案 0 :(得分:1)

您可以使用:

select a.ID, 
       a.Date_Reported, 
       b.Date_Received
from tx_ext a 
join tx b on b.id = a.id
AND b.Date_Reported >= DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) 
AND b.Date_Reported <= EOMONTH(GETDATE());

<强> DBFiddle Demo

请注意,结束日期为30/06/2018 00:00:00,因此我假设您将Date_Reported存储为DATE(而不是DATETIME)。如果你有时间,你需要改为:

AND b.Date_Reported < DATEADD(d,1,EOMONTH(GETDATE())) 

修改

select a.ID, 
       a.Date_Reported, 
       b.Date_Received
from tx_ext a 
join tx b on b.id = a.id
AND b.Date_Reported>=DATEADD(month,-1,DATEADD(month,DATEDIFF(month,0,GETDATE()),0))
AND b.Date_Reported<DATEADD(d,1,EOMONTH(GETDATE(),-1)) ;

答案 1 :(得分:1)

也考虑这个表单(它可以在较旧的SQL Server版本中使用)。

select a.ID, 
       a.Date_Reported, 
       b.Date_Received
from tx_ext a 
join tx b on b.id = a.id
AND YEAR(b.Date_Reported) = CASE WHEN MONTH(GETDATE()) = 1
                                 THEN YEAR(GETDATE()) - 1
                                 ELSE YEAR(GETDATE())
                            END
AND MONTH(b.Date_Reported = CASE WHEN MONTH(GETDATE()) = 1
                                 THEN 12
                                 ELSE MONTH(GETDATE()) - 1
                            END