SQL删除日期早于x天的所有行

时间:2018-10-18 17:01:16

标签: database sqlite

我有一个如下表,我正在尝试从当前日期删除所有createDate早于10天的行,例如要从表中删除最后3个流

ID  Name    createdDate(string)
76  Stream1 2018-10-18T00:00:00 
70  Stream2 2018-10-17T00:00:00 
50  Stream3 2018-10-03T00:00:00 
32  Stream4 2018-09-22T00:00:00 
21  Stream5 2018-09-21T00:00:00 

我在下面尝试过查询,但是没有用,请帮忙

DELETE FROM myTable WHERE TO_DATE(createdDate) < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 10 DAY))

DELETE FROM myTable WHERE TO_DATE(createdDate) < NOW()- INTERVAL 10 DAY;

5 个答案:

答案 0 :(得分:1)

为了提高性能,要允许MySQL使用范围扫描(使用以createdDate为首的索引),我将引用WHERE中的 bare 列条款。

我将在比较的字面上进行所有必需的操作,以提出一个可以将裸列与之进行比较的字符串。

我首先要编写一个SELECT语句,以验证它是否正常运行(在我们运行DELETE并发现它删除的内容超出我们的预期之前)

我们可以在一个简单的SELECT语句中测试表达式,例如

SELECT DATE_FORMAT( NOW() + INTERVAL -10 DAY , '%Y-%m-%dT00:00:00') AS dt 

然后我们可以在WHERE子句中使用该表达式

SELECT t.* 
  FROM myTable t 
WHERE t.createddate  <   DATE_FORMAT( NOW() + INTERVAL -10 DAY , '%Y-%m-%dT00:00:00')
ORDER BY t.createddate DESC

此表达式使用'00:00:00'午夜作为时间成分;还有其他表达式可以达到相同的结果。

WHERE t.createddate  <   DATE_FORMAT( DATE(NOW()) + INTERVAL -10 DAY , '%Y-%m-%dT%T')

我们确实需要缩小范围,并具体说明“比当前日期早10天”的含义。

一旦我们确定查询返回了要删除的行,则可以通过替换SELECT关键字并省略ORDER BY

将其转换为DELETE语句。
SELECT t.* 
  FROM myTable t 
WHERE t.createddate  <   DATE_FORMAT( NOW() + INTERVAL -10 DAY , '%Y-%m-%dT00:00:00')

答案 1 :(得分:0)

我不认为to_date()是MySQL中的函数。只需使用date()

DELETE FROM myTable
WHERE DATE(createdDate) < NOW() - INTERVAL 10 DAY;

答案 2 :(得分:0)

MySQL中没有To_date()函数。您将需要使用Str_To_Date()函数:

DB Fiddle DEMO

DELETE FROM myTable 
WHERE STR_TO_DATE(createdDate, '%Y-%m-%dT%T') < NOW()- INTERVAL 10 DAY;

详细信息:

  • %Y年,为4位数字
  • %m月名称为数字值(00到12)
  • %d每月的某天,以数字值(01到31)
  • %T时间以24小时制(hh:mm:ss)
  • 您的日期时间字符串中还有一个附加的“ T”子字符串。使用T
  • 直接表示

答案 3 :(得分:0)

我认为比较的两个方面都需要日期转换

   DELETE FROM myTable 
   WHERE DATE(createdDate) < date(NOW()- INTERVAL 10 DAY);

答案 4 :(得分:0)

MySQL中没有函数TO_DATE。您可以改用以下查询:

DELETE FROM myTable WHERE DATE(createDate) < DATE_SUB(NOW(), INTERVAL 10 DAY);