根据用户表选择1月份的最近3个月记录

时间:2015-01-06 01:57:57

标签: sql sql-server sql-server-2008

我在数据库中有一条记录,如下所示

ID        RDate       Name
 1         1/1/2015     A
 2         1/1/2015     B
 3         31/12/2014   A
 4         3/12/2014    A
 5         22/10/2014   C
 6         1/8/2014     D

我希望根据当前日期选择当前月份记录和过去3个月的记录。

我的查询如下

Select * from tbl1 where month(RDate) = Month(getdate()) and Year(RDate) = Year(getdate())

我可以获得当前的月份记录。我可以在查询

下面获得上个月的记录
Select * from tbl1 where month(RDate) = Month(Dataadd(month, -1, RDate)) and  Year(RefDate) = Year(DateAdd(year, -1, RDate))

问题是当前月份是2015年4月,我最近3个月的记录将是2015年3月,2015年2月和2015年1月。对于年份的查询将是不正确的,因为查询中的年份为负1。如何使查询动态化?

3 个答案:

答案 0 :(得分:1)

您可以使用dateadddatediff函数

dateadd(month, datediff(month, 0, getdate())-3, 0)给出当月的开始 - 3个月

如果今天运行,上面的

将于2014年10月1日发布。

dateadd(month, datediff(month, 0, getdate()), -1)给出了上一个月的最后一天

如果今天运行,上面的

将于2014年12月31日发布。

select * from Table1
where RDate between
dateadd(month, datediff(month, 0, getdate())-3, 0),
AND 
dateadd(month, datediff(month, 0, getdate()), -1)

答案 1 :(得分:0)

这个怎么样:

CREATE TABLE tbl1(
    ID      INT,
    RDate   DATE,
    Name    VARCHAR(5)
)
INSERT INTO tbl1 VALUES
(1, '20150101', 'A'),
(2, '20150101', 'B'),
(3, '20141231', 'A'),
(4, '20141203', 'A'),
(5, '20141022', 'C'),
(6, '20140801', 'D');

SELECT * 
FROM tbl1 
WHERE
    (
        RDate >= DATEADD(MM, DATEDIFF(MM, 0, GETDATE()), 0) -- First day of the current month
        AND RDate < DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) + 1, 0) -- First day of the next month
    )
    OR (
        RDate >= DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) - 3, 0) -- 3 months less than the current month
        AND RDate < DATEADD(MM, DATEDIFF(MM, 0, GETDATE()), 0)  -- First day of the current month
    )
DROP TABLE tbl1

当然,您可以合并WHERE子句:

WHERE
    RDate >= DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) - 3, 0) -- 3 months less than the current month
    AND RDate < DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) + 1, 0) -- First day of the next month

有关更常见的日期例程,请参阅:http://www.sqlservercentral.com/blogs/lynnpettis/2009/03/25/some-common-date-routines/

答案 2 :(得分:0)

比较第一个和第二个查询的结果。如果您想要本月和过去3个完整日历月的数据,请使用第二个查询。


declare @t table (ID int, RDate date, Name char)

insert into @t values (1,'2015-01-01','A'), (2,'2015-01-01','B'), (3,'2014-12-31','A'), (4,'2014-12-03','A'), (5,'2014-10-22','C'), (6,'2014-09-01','D'), (7,'2014-09-06','D'), (8,'2014-09-05','D'), (9,'2014-08-01','D')

declare @comparison_date date = '2015-01-06'

select * from @t where RDate > dateadd(month,-4,@comparison_date)

select * from @t where RDate > dateadd(month,-4,dateadd(day,-datepart(dd,@comparison_date),@comparison_date))