【问题标题】:Delete rows with date older than 30 days with SQL Server query使用 SQL Server 查询删除日期超过 30 天的行
【发布时间】:2011-05-20 21:04:24
【问题描述】:

我需要一条 SQL 语句来删除超过 30 天的行。

我的表events 有一个字段date,其中包含插入数据库的日期和时间。

这行得通吗?
SELECT * from Results WHERE [Date] >= DATEADD(d, -30, getdate())

【问题讨论】:

  • 其实.... 删除“字段”??您删除行,而不是字段。是否要将字段设为 NULL?
  • 您上面的 SQL 将选择天数在过去 30 天内的行。
  • 实际上,这是一个错字问题,您基本上把比较符号的方向弄错了。

标签: sql-server date-arithmetic


【解决方案1】:

你也可以使用

SELECT * from Results WHERE date < NOW() - INTERVAL 30 DAY;

【讨论】:

  • 很好的解决方案,但在其他查询中使用 NOW() 时要小心,它不会进一步缓存它
【解决方案2】:

GETDATE() 不适用于我使用 mySQL 8

错误 1305 (42000):函数 mydatabase.GETDATE 不存在

但确实如此:

DELETE FROM table_name WHERE date_column < CURRENT_DATE - 30;

【讨论】:

  • 根据问题上的标签,问题与 SQL Server 相关,而不是 mySQL。
【解决方案3】:

我们可以使用这个:

    DELETE FROM table_name WHERE date_column < 
           CAST(CONVERT(char(8), (DATEADD(day,-30,GETDATE())), 112) AS datetime)

但更好的选择是使用:

DELETE FROM table_name WHERE DATEDIFF(dd, date_column, GETDATE()) > 30

前者是不可搜索的(即在表达式右侧的函数,因此它不能使用索引)并且需要 30 秒,后者是可搜索的并且花费不到一秒。

【讨论】:

    【解决方案4】:

    要从表中删除 Date_column 中日期时间值超过 30 天的记录,请使用以下查询:

    USE Database_name;
    DELETE FROM Table_name
    WHERE Date_column < GETDATE() - 30
    

    ...或者这个:

    USE Database_name;
    DELETE FROM Table_name
    WHERE Date_column < DATEADD(dd,-30,GETDATE())
    

    从表中删除 Date_column 中日期时间值超过 12 小时的记录:

    USE Database_name;
    DELETE FROM Table_name
    WHERE Date_column < DATEADD(hh,-12,GETDATE())
    

    从表中删除 Date_column 中日期时间值超过 15 分钟的记录:

    USE Database_name;
    DELETE FROM Table_name
    WHERE Date_column < DATEADD(mi,-15,GETDATE())
    

    发件人:http://zarez.net/?p=542

    【讨论】:

    • 在您发布之前很久,使用DATEADD(GETDATE()) 的技术在此页面上已是一条老路。您的答案仅包含多余的建议,或者如果有新建议,它不会回答发布的问题。换句话说,新部分对于发布的问题来说是无用的部分。想象一下,如果每个人在想要发布答案时都这样做——他们复制之前发布的答案,然后扩大页面范围以适应他们自己的答案……我们不会为研究人员提供一个好的、干净的、集中的资源。
    • 发布时间与 Stack Overflow 上的良好内容管理无关。
    【解决方案5】:

    我更喜欢将其保留为日期时间字段并仅将其设置为日期(没有时间)。

    SELECT * FROM Results 
    WHERE CONVERT(date, [Date]) >= CONVERT(date, GETDATE())
    

    【讨论】:

      【解决方案6】:

      在 WHERE 子句中使用 DATEADD

      ...
      WHERE date < DATEADD(day, -30, GETDATE())
      

      您也可以使用缩写ddd 代替day

      【讨论】:

      • 如果您需要 1 个月而不是平均每月 30 天,则可以将其修改为 DATEADD(MONTH, -5, GETDATE())
      • FUNCTION fu_dev.DATEADD 不存在。为什么我会收到此错误? fu_dev 是我的数据库。
      • @iMatoria 明确一点应该是DATEADD(MONTH, -1, GETDATE()),使用 -5 会起飞 5 个月而不是 1 个月。
      • @Colin;太棒了,我能够快速修复我的查询。但是如果您在查询中处理超过 3 个日期,我仍然可以使用此语句吗?
      • @PatsonLeaner 这只是一个子句,您可以通过将子句与 AND 或 OR 连接在一起来过滤尽可能多的日期。
      【解决方案7】:

      您也可以在两个日期之间设置:

      Delete From tblAudit
      WHERE Date_dat < DATEADD(day, -360, GETDATE())
      GO
      Delete From tblAudit
      WHERE Date_dat > DATEADD(day, -60, GETDATE())
      GO
      

      【讨论】:

        【解决方案8】:

        虽然DATEADD 可能是最透明的方式,但值得注意的是 只需getdate()-30 就足够了。

        另外,您是否正在寻找从现在起的 30 天,即包括小时、分钟、秒等?或从今天午夜起 30 天(例如 12/06/2010 00:00:00.000)。在这种情况下,您可以考虑:

        SELECT * 
        FROM Results 
        WHERE convert(varchar(8), [Date], 112) >= convert(varchar(8), getdate(), 112)
        

        【讨论】:

          猜你喜欢
          • 2018-08-24
          • 2011-10-31
          • 1970-01-01
          • 2011-04-21
          • 1970-01-01
          • 2018-03-07
          • 1970-01-01
          • 2016-04-18
          • 1970-01-01
          相关资源
          最近更新 更多