【问题标题】:SQL query to delete records from a query从查询中删除记录的 SQL 查询
【发布时间】:2016-11-30 16:38:33
【问题描述】:

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

【问题讨论】:

  • 要删除多少条记录?它是在运行而不是完成,还是在运行和完成而不删除任何内容?
  • 在查询之前是否已提交更改?
  • 因此查询运行得非常快(在 5-15 秒内)并显示“0 行受影响”。表中大约有 4-5m 条记录。但是当我在预测日期上进行选择时,我可以看到全年的日期。
  • 如果您运行与 select 相同的查询,它是否返回行?
  • 返回 0 行。从 RPT_HistSnapEng_temp 中选择 COUNT (*),其中 ForecastDate

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


【解决方案1】:

您当前的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 between:

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(它包含日期参数)进行这种类型的范围检查,而不是使用 &gt;= 和 @ 987654327@ 或混淆 andor 您似乎已经完成了。我也喜欢 ANSI 标准 current_timestamp 而不是 t-sql 特定的 getdate(),但它们是等价的。

【讨论】:

    【解决方案2】:

    在 dateadd 函数中尝试“ww”或“wk”而不是“week”。尝试使用 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))
    

    【讨论】:

    • 我将如何使用上述查询删除选定的记录?
    • 仍然说 0 行受到影响我可以看到 2016 年 12 月的日期。(根据他的代码,我应该只能看到未来 7 周的日期)。我应该尝试改用alter table code吗?
    • 从头开始,它工作得很好,非常感谢。我不得不将两个 where 子句分成 2 个不同的查询
    • 这里的and 应该是or
    • 确认,是的,谢谢@Tim! OR 不是 AND,一个查询将起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多