如何获得最近9个月的数据?

时间:2011-06-14 15:38:41

标签: sql sql-server sql-server-2005 tsql sql-server-2008

我正在处理存储过程并需要最近9个月的数据。需要一种语法当新数据添加到表格时,将自动删除最旧的数据(最近9个月的数据)。

该语法将用于Select Syntax。

我用过

select * from tablename t
left outer join calendartable r on
t.fiscal_month=r.fiscal_month
where t.date > dateadd(m,-9,date) 

我知道这是错的。你能帮我解决这个问题。

由于

3 个答案:

答案 0 :(得分:5)

您可能希望GETDATE计算从现在开始的九个月边界:

where t.date >= dateadd(m,-9, GETDATE())

请注意,如果t.date是一个日期和时间字段而不仅仅是日期,您将看到九个月边界上的奇怪行为,除非您还要比较之前的时间。

或者,如果您将其与其他值进行比较,例如在你的触发器中插入记录的日期然后你所得到的可能是好的,例如

之类的东西
declare @latest date
select @latest = inserted.date
delete from ... where t.date < dateadd(m, -9, @latest)

虽然我建议您实际归档数据,但不要删除它。


既然您已经澄清了整个月,即从上个月底开始的9个月,您可以使用

declare @today date;
declare @firstOfMonth date;
declare @nineMonthsAgo date;
set @today = GETDATE();
set @firstOfMonth = DATEADD(d, 1-DAY(@today), @today);
set @nineMonthsAgo = DATEADD(m, -9, @firstOfMonth);

... WHERE date >= @nineMonthsAgo AND date < @firstOfMonth

答案 1 :(得分:1)

看起来非常接近。你现在需要9个月,或者从给定日期开始需要9个月吗?

怎么样:

declare @date datetime

set @date = dateadd(m, -9, getdate()) -- 9 months from right now

select * 
from tablename t
  left outer join calendartable r 
   on t.fiscal_month=r.fiscal_month
where t.date > @date

答案 2 :(得分:1)

如果您需要在添加新数据时删除数据,则需要在触发器中执行此操作。触发器内的sintax就是这样。

DELETE t
FROM 
tablename t
left outer join calendartable r on
t.fiscal_month=r.fiscal_month
where datediff(month, t.date, GETDATE()) > 9

检索数据的选择将类似。

select * from tablename t
left outer join calendartable r on
t.fiscal_month=r.fiscal_month
where datediff(month, t.date, GETDATE()) < 9