我在数据库中有一条记录,如下所示
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。如何使查询动态化?
答案 0 :(得分:1)
您可以使用dateadd
和datediff
函数
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))