从MySQL表中删除日期字段为两周或更早的行

时间:2016-11-09 21:16:48

标签: mysql date delete-row

我不得不在Perl脚本上浏览其他人的代码,该脚本使用任何新记录更新MySQL表,并且还应该从表中删除报告日期为两周或更长时间的任何记录。目前,该脚本没有报告日期的日期字段,而是一个整数字段(不确定为什么这样做)。 Perl脚本调用一个.sql文件,该文件应该处理删除,但它无法正常工作。

哪种更容易使用?保留一个整数字段或将其更改为日期字段并更改其sql语句以反映该情况?

这是当前的删除语句,如果这有帮助(对我来说有点太复杂了) -

DELETE FROM Spectros
WHERE
    (spectroReportDt LIKE CONCAT(MONTH(CURDATE()),
        '%',
        DAY(CURDATE()) - 14,
        YEAR(CURDATE()))

        OR spectroReportDt LIKE CONCAT(MONTH(CURDATE()) - 1,
        '%',
        DAY(CURDATE()) + 14,
        YEAR(CURDATE()))

        OR spectroReportDt LIKE CONCAT(MONTH(CURDATE()) + 11,
                '%',
        DAY(CURDATE()),
        YEAR(CURDATE()) - 1))

    AND (CAST(SUBSTR(spectroReportDt, LENGTH(MONTH(CURDATE())) + 1, 2) AS UNSIGNED) <= DAY(CURDATE()) - 14

                OR CAST(SUBSTR(spectroReportDt, 1, LENGTH(MONTH(CURDATE()))) AS UNSIGNED) != MONTH(CURDATE()))

并且reportDate字段在更新的文本文件中是MMDDYYYY,并且在MySQL表中 - 除了记录中的一个数字月份没有前导零,因为它是一个整数。

1 个答案:

答案 0 :(得分:0)

如果你为该列使用了DATE字段,并且应该,那么你可以使用DATE_SUB()执行此操作:

DELETE FROM Spectros WHERE spectroReportDt < DATE_SUB(NOW(), INTERVAL 14 DAY)

如果你在一张大桌子上这样做,你会希望将你的日期字段编入索引,这样就不会那么慢。

如果您以其他格式存储日期,则可能需要在此处进行转换。 MMDDYYYY格式是丑陋的,非标准的,并且是一种痛苦,因为它无法排序。将其翻转为ISO格式YYYY-MM-DD将有助于相当

您可以使用以下方式即时转换:

WHERE STR_TO_DATE(spectroReportDt, '%m%d%Y') < DATE_SUB(...)

这需要重型表扫描,因此它不太理想。如果您遇到前导零问题,则可能需要先格式化:

WHERE STR_TO_DATE(LPAD(spectroReportDt, 8, 0), '%m%d%Y') < DATE_SUB(...)