在MySQL Datetime字段中查询11个月前创建的任何记录

在MySQL Datetime字段中查询11个月前创建的任何记录,mysql,sql,datetime,select,Mysql,Sql,Datetime,Select,基本上,我有一个orders表,每天我都运行一个cronjob来检查日志,看看哪些客户11个月前订购了,因为我需要警告他们保修期将在1个月内到期。完成此查询的最佳方式是什么 我可以用几种方法来做,但我想看看最好的方法的意见。我会用一个月的间隔时间,并将其与现在()进行比较。: 选择* 从命令 其中添加日期(订单日期,间隔11个月) 这将查找订单日期值正好为11个月的所有行 SELECT * FROM orders WHERE order_date = UNIX_TIMESTAMP(DATE_SU

基本上,我有一个
orders
表,每天我都运行一个cronjob来检查日志,看看哪些客户11个月前订购了,因为我需要警告他们保修期将在1个月内到期。完成此查询的最佳方式是什么

我可以用几种方法来做,但我想看看最好的方法的意见。

我会用一个月的
间隔时间
,并将其与
现在()进行比较。

选择*
从命令
其中添加日期(订单日期,间隔11个月)
这将查找订单日期值正好为11个月的所有行

SELECT *
FROM orders
WHERE order_date = UNIX_TIMESTAMP(DATE_SUB(curdate(), INTERVAL 11 MONTH)) 

我添加了UNIX_时间戳,因为MySQL将日期存储在UNIX时间戳中

如果可能,我建议不要对WHERE子句中的字段调用函数;它消除了索引的任何性能优势。当然,如果没有索引,就不会“受伤”;但如果以后添加索引,则需要重写以利用它们。它可能会在内部这样存储它们,但比较不起作用。例如:
CURDATE()=unix\u时间戳(CURDATE())
为false。即使它真的起作用了,这似乎有点毫无意义,因为您希望
DATE\u SUB()
已经返回一个与日期字段相当的值。
SELECT *
FROM orders
WHERE order_date = CURDATE() - INTERVAL 11 MONTH
;
SELECT *
FROM orders
WHERE order_date = UNIX_TIMESTAMP(DATE_SUB(curdate(), INTERVAL 11 MONTH))