问题描述
|
我正在处理存储的proc,并且需要最近9个月的数据。需要一种语法,当将新数据添加到表中时(最新的9个月数据),该语法将自动删除最旧的数据。
该语法将在“选择语法”中使用。
我用过
select * from tablename t
left outer join calendartable r on
t.fiscal_month=r.fiscal_month
where t.date > dateadd(m,-9,date)
我知道这是错的。你们能帮我这个忙吗?
谢谢
解决方法
您可能希望GETDATE从现在开始计算九个月的边界:
where t.date >= dateadd(m,-9,GETDATE())
请注意,如果t.date是一个日期和时间字段,而不仅仅是日期,那么您会在9个月的边界上看到奇怪的行为,除非您也舍入了比较之前的时间。
或者,如果您要将其与另一个值进行比较,例如您在触发器中插入记录的日期,那么您可能就可以了,例如就像是
declare @latest date
select @latest = inserted.date
delete from ... where t.date < dateadd(m,@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,@firstOfMonth);
... WHERE date >= @nineMonthsAgo AND date < @firstOfMonth
, 似乎很接近。您现在需要9个月还是给定日期9个月?
怎么样:
declare @date datetime
set @date = dateadd(m,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
, 如果在添加新数据时需要删除数据,则需要在触发器中执行。触发器内部的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,GETDATE()) < 9