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

问题描述:

我不得不通过Perl脚本上的其他人的代码来更新具有任何新记录的MySQL表,并且应该还从表中删除任何记录报告日期是两周或更长。目前,该脚本没有报告日期的日期字段,而是一个整数字段(不知道为什么这样做)。 Perl脚本调用一个.sql文件,该文件应该处理删除操作,但它不起作用。从MySQL表中删除日期字段为两周或更长的行的日期

哪个更容易处理?留下一个整数字段或将其更改为日期字段并更改其sql语句以反映该问题?

这是当前delete语句,如果这能帮助(有点太复杂,我还没有解决) -

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

或者:只使用内置的功能...您可以使用FROM_UNIXTIME转换... HTTP://计算器.com/questions/2367603/mysql-convert-int-to-datetime假设它是unix_time ...或使用[UNIX_TIMESTAMP](http://dev.mysql.com/doc/refman/5.7/en/date- and-time-functions.html#function_unix-timestamp)将日期转换为可以比较的整数。请务必阅读说明:... – xQbert

+0

也许这是一个unix时间戳... – Hackerman

+0

可以写成Brainf * ck ;-)良好 –

如果您使用的是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(...) 
+0

这非常有帮助,谢谢。而这张表只有约3,900个记录,所以不应该长时间运行。 – BigRedEO