拉取前三个月的记录

时间:2015-04-13 15:10:02

标签: sql sql-server

我想撤回所有具有前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()))

3 个答案:

答案 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 Fiddle Demo

不要在sql中使用BETWEEN子句。