我想撤回所有具有前3个月报告日期的行。因此,如果我在2015年3月运行代码,我想从2月15日,1月15日12月14日撤回数据。
我试图使用以下内容但没有取得多大成功
Select * from table
where DATEPART(month, ReportDate) between Month(DATEADD(month, -1,GETDATE())) and Month(DATEADD(month, -3,GETDATE()))
答案 0 :(得分:1)
您可以使用以下方式获取当月的第一天:
SELECT DATEADD(MONTH, DATEDIFF(MONTH, '1900001', GETDATE()), '19000101')
这基本上只是获得从现在到固定日期之间的月数,然后将这个月数加回到相同的固定日期,以获得当月的第一个月。然后只是将其添加到您的查询中的情况,因此您的伪代码是:
WHERE ReportDate < [start of this month]
AND ReportDate >= [start of 4 months ago]
您的实际代码是:
WHERE ReportDate < DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101')
AND ReportDate >= DATEADD(MONTH, DATEDIFF(MONTH, '19000401', GETDATE()), '19000101');
请注意,我已从ReportDate列中删除了该函数,该列将生成谓词sargable
以下是一些关于查询日期范围的好文章:
答案 1 :(得分:0)
试试这个:
SELECT *
FROM YourTableName
WHERE ReportDate
BETWEEN DATEADD(month, -4,GETDATE()) AND
DATEADD(month, -1,GETDATE())
答案 2 :(得分:0)
您可以尝试这样的事情,
create table Test(id int, TranDate datetime)
insert into Test (id, TranDate) values
(1, '2014-12-12'),
(2, '2014-11-10'),
(3, '2015-04-01'),
(4, '2015-02-02'),
(5, '2015-01-01')
declare @FromDate DateTime = dateadd(month, -4, getdate())
declare @ToDate DateTime = dateadd(month, -1, getdate())
select * from Test where TranDate >= @FromDate and TranDate <= @ToDate
不要在sql中使用BETWEEN
子句。