【问题标题】:Delete items older than a day - SQL Server删除超过一天的项目 - SQL Server
【发布时间】:2010-12-08 00:08:10
【问题描述】:

在我的数据集的一个表中,我有一个数据时间列,它存储添加记录的时间。如何在运行存储过程时删除所有早于一天的记录(考虑当前时间)?

【问题讨论】:

    标签: sql sql-server datetime


    【解决方案1】:

    您可以使用 datediffgetdate 函数构建 DELETE 语句。

    使用示例:

    DELETE FROM yourTable WHERE DATEDIFF(day,getdate(),thatColumn) < -1
    

    【讨论】:

    • 你搞错了。基于这个问题,“thatColumn”将永远是过去,而你写这个的方式,你的 DATEDIFF 将永远大于 0。正确的方法是:“DELETE FROM yourTable WHERE DATEDIFF(day,getdate(),thatColumn) 1"
    【解决方案2】:

    对于 SQL,您必须指定“超过一天”的含义。

    • DATEDIFF:它使用日期边界午夜,因此在 10 月 19 日 00:05 运行它,您将删除 6 分钟前的行(10 月 18 日 23:59)

    • 24 小时?

    • 昨天午夜? 10 月 19 日运行代码,删除 18 日之前的行?

    另外,不要将函数放在列上。

    假设 24 小时到分钟:

    DELETE
        MyTableWhere
    WHERE
        MyColumn < DATEADD(day, -1, GETDATE())
    

    假设昨天午夜:

    DELETE
        MyTableWhere
    WHERE
        MyColumn < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), -1)
    

    【讨论】:

      【解决方案3】:
      Delete <TableName>
      Where DATEDIFF(day, <ColumnName>, getdate()) > 0
      

      拉吉

      【讨论】:

      • 你可能忘记了'FROM' ;)
      • 删除语句不需要 From :)
      • 带有这些关键字的奇怪大小写。
      【解决方案4】:

      我通常建议不要从数据库中实际删除数据,因为您永远不知道何时可能需要返回并恢复或回滚到以前的记录,因为数据损坏或审计等。相反,我会添加一个位列标题像 "IsDeleted" 并使用更新语句将旧条目设置为 true。

      类似

      'UPDATE tablename SET IsDeleted = 1 WHERE (DATEDIFF(day,DateCreatedOn,GETDATE()) > 0)
      

      DateCreatedOn 是您的记录创建日期或时间戳日期所在的位置

      【讨论】:

      • 在不知道问题集的情况下,这是一个艰难的概括。删除数据的充分理由有很多。如果您需要回滚或恢复,这就是您有备份的原因。如果您的应用程序的标准操作意味着您不再需要数据,请删除数据。
      • 如果您从不删除数据,最终——不可避免地——过度拥挤的表会导致性能下降。如果您必须保持数据“热”,将其复制到存档表,然后从源中删除,也许在几个小时后,应该是一个可行的选择。
      • 我承认它有点过分热心,但最好有它而不需要它,然后没有它并且需要它。想象一下,您会从客户那里得到什么样的回应,他说他们需要过去 5 年电子商务应用程序中的所有销售记录,而您对他们的回应是“我们删除了它,因为它太旧了,目前应用程序不需要”。仅仅因为应用程序本身可能不需要数据,并不意味着客户端不需要它也可以不需要它。
      • 我很久以前发现的一个被忽视的设计标准是:对于每个事实(表、列等),确定它的生命周期——什么时候可以删除、删除、忘记它。这样您就知道 client 需要五年的数据。 (应用需要性能,客户端需要数据,实现需要同时支持两者。)
      • @Philip,我同意你的最后陈述,再次查看我的回答,我明白你为什么强调你的观点。我想要回答的只是这个问题提出的“永远删除”的概念。当然,我认为将“旧”数据从生产表移动到某种存档以提高性能没有问题。我只是相信,如果没有某种恢复方式,任何数据都不应该被物理删除。
      【解决方案5】:

      假设日期列是“RecordCreatedDate”

      从你的表中删除记录创建日期

      我只提醒您,如果您的数据库有数百万行,那么您应该在 RecordCreatedDate 列上有一个索引,并且如果您要删除大量数据,则可能进行较小的批量删除。

      【讨论】:

        【解决方案6】:

        从 YourTable 中删除 DateColumn

        【讨论】:

          【解决方案7】:

          ts >= now() - 间隔 1 天

          其中 ts 是日期时间列的名称

          【讨论】:

          • 是的。至少在 MySQL 上。
          • @Zepplock MySQL 不是 SQL Server。 SQL Server 是 Microsoft 的关系数据库系统的产品名称。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-20
          • 2015-04-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-24
          • 2016-08-03
          • 1970-01-01
          相关资源
          最近更新 更多