从 MySQL table 中删除日期字段为两周或更早的行
Delete rows from MySQL table where date field is two weeks or older
我必须在 Perl 脚本上检查其他人的代码,该脚本会用任何新记录更新 MySQL table 并且还应该从 table 中删除任何记录报告日期为两周或更长时间。目前,该脚本没有用于报告日期的日期字段,而是一个整数字段(不确定为什么这样做)。 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 字段在它更新的文本文件和 MySQL table 中是 MMDDYYYY - 除了记录中的一位数字月份没有前导零,因为它是整数。
如果您正在为该列使用 DATE
字段,并且您 应该 ,那么您可以使用 DATE_SUB()
:
DELETE FROM Spectros WHERE spectroReportDt < DATE_SUB(NOW(), INTERVAL 14 DAY)
如果您在大型 table 上执行此操作,您需要将日期字段编入索引,这样就不会慢得让人痛苦。
如果您的日期以其他格式存储,您可能需要在此处进行转换。 MMDDYYYY
格式丑陋、不标准,而且很痛苦,因为无法对其进行排序。将其转换为 ISO 格式 YYYY-MM-DD
将相当大地帮助。
您可以使用此方法即时转换:
WHERE STR_TO_DATE(spectroReportDt, '%m%d%Y') < DATE_SUB(...)
这需要重型 table 扫描,因此不太理想。如果前导零有问题,您可能需要先格式化:
WHERE STR_TO_DATE(LPAD(spectroReportDt, 8, 0), '%m%d%Y') < DATE_SUB(...)
我必须在 Perl 脚本上检查其他人的代码,该脚本会用任何新记录更新 MySQL table 并且还应该从 table 中删除任何记录报告日期为两周或更长时间。目前,该脚本没有用于报告日期的日期字段,而是一个整数字段(不确定为什么这样做)。 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 字段在它更新的文本文件和 MySQL table 中是 MMDDYYYY - 除了记录中的一位数字月份没有前导零,因为它是整数。
如果您正在为该列使用 DATE
字段,并且您 应该 ,那么您可以使用 DATE_SUB()
:
DELETE FROM Spectros WHERE spectroReportDt < DATE_SUB(NOW(), INTERVAL 14 DAY)
如果您在大型 table 上执行此操作,您需要将日期字段编入索引,这样就不会慢得让人痛苦。
如果您的日期以其他格式存储,您可能需要在此处进行转换。 MMDDYYYY
格式丑陋、不标准,而且很痛苦,因为无法对其进行排序。将其转换为 ISO 格式 YYYY-MM-DD
将相当大地帮助。
您可以使用此方法即时转换:
WHERE STR_TO_DATE(spectroReportDt, '%m%d%Y') < DATE_SUB(...)
这需要重型 table 扫描,因此不太理想。如果前导零有问题,您可能需要先格式化:
WHERE STR_TO_DATE(LPAD(spectroReportDt, 8, 0), '%m%d%Y') < DATE_SUB(...)