我正在处理存储过程并需要最近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)
我知道这是错的。你能帮我解决这个问题。
由于
答案 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