我不得不在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表中 - 除了记录中的一个数字月份没有前导零,因为它是一个整数。
答案 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(...)