我正在尝试编写2个查询来删除日期大于特定日期的记录:
第一个:
delete from RPT_HistSnapEng_temp
where ForecastDate> DATEADD(WEEK,7,CAST(GETDATE() AS DATE))
此查询会在Forecastdate从今天起超过7周时删除记录
第二个是:
delete from RPT_HistSnapEng_temp
where ForecastDate< DATEADD(WEEK,-6,CAST(GETDATE() AS DATE))
此查询会在Forecastdate从今天起不到6周时删除记录。
所以基本上,这应该从2015年12月到2016年11月过滤掉记录,并且只显示从今天开始的6周和接下来7周的记录。
即使查询运行,它也不会删除记录。我无法硬编码日期,因为我将在SSIS包中滚动使用此查询。
答案 0 :(得分:0)
尝试&#34; ww&#34;或者&#34; wk&#34;而不是&#34;周&#34;在dateadd函数中。尝试使用SELECT语句来获取要删除的记录:
SELECT ID, ForecastDate
FROM RPT_HistSnapEng_temp
WHERE CAST(ForecastDate AS DATE) > DATEADD(ww,7,CAST(GETDATE() AS DATE))
OR CAST(ForecastDate AS DATE) < DATEADD(WEEK,-6,CAST(GETDATE() AS DATE))
ORDER BY ForecastDate
要删除,只需删除SELECT和ORDER BY:
DELETE
FROM RPT_HistSnapEng_temp
WHERE CAST(ForecastDate AS DATE) > DATEADD(ww,7,CAST(GETDATE() AS DATE))
OR CAST(ForecastDate AS DATE) < DATEADD(WEEK,-6,CAST(GETDATE() AS DATE))
答案 1 :(得分:0)
您当前的where
条款正在尝试获取的记录均小于过去的日期且大于将来的日期。我认为你(和另一个答案)应该使用or
。
但是,由于这看起来像是一个临时表,你正在加载然后报告,我会调整你的插入来简单地抓取你想要的记录,而不是加载超过你需要的然后删除。
select *
from RPT_HistSnapEng -- base table name?
where cast(ForecastDate as date) between dateadd(week, -6, cast(current_timestamp as date)) and dateadd(week, 7, cast(current_timestamp as date))
如果获得了您需要的记录,只需将插入添加到其中即可。
但是,要直接回答有关删除的问题,可以将此查询更改为在以下之间使用NOT:
delete
from RPT_HistSnapEng_temp
where cast(ForecastDate as date) not between dateadd(week, -6, cast(current_timestamp as date)) and dateadd(week, 7, cast(current_timestamp as date))
正如您所看到的,我喜欢使用between
(日期参数的包含)进行此类范围检查,而不是使用{{1 }}和>=
或混淆了您似乎已经完成的<
和and
。我也喜欢ANSI标准or
而不是特定于t-sql的current_timestamp
,但它们是等效的。