用于从查询中删除记录的SQL查询

时间:2016-07-26 21:08:26

标签: sql sql-server sql-server-2008 date range

我正在尝试编写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包中滚动使用此查询。

2 个答案:

答案 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,但它们是等效的。