我有一个表,其中不同的列中有年份和月份,我需要找到 3 个月前到现在的所有行。
SELECT * FROM `table`
WHERE DATE(CONCAT(`year`, '-', `month`, '-01')) >=
DATE_FORMAT(NOW() - INTERVAL 3 MONTH, '%Y-%m-01')
Run Code Online (Sandbox Code Playgroud)
它看起来相当冗长,并且可能效率低下,因为这是一个非常大的表。有一个更好的方法吗?
当日期存储为单独的字段时,没有太多优化,但我会将您的查询重写为:
SELECT *
FROM `table`
WHERE STR_TO_DATE(`year`+ '-'+ `month` + '-01', '%Y-%m-%d') >= DATE_SUB(NOW(), INTERVAL 3 MONTH)
Run Code Online (Sandbox Code Playgroud)
year连接使得和列上的索引month毫无用处。
有关 MySQL 日期函数的更多信息,请参阅:http ://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html