我有一个带有多个日期类型字段的MySQL DB表。我需要在此表上执行不同的SELECT查询,但是我不确定哪种方法是查找同一月份的记录的最佳方法。
我知道我可以执行以下操作:
SELECT *
FROM table
WHERE MONTH(somedate) = 5
AND YEAR(somedate) = 2015
但是我一直在读那些效率不高的书,应该使用实际的日期,即
SELECT *
FROM table
WHERE somedate BETWEEN '2015-05-01' AND '2015-05-31'
但是,我所需要的只是月份和年份,它们是来自PHP的变量。如果我选择第二种选择,我如何轻松快速地计算该月的最后一天?
最佳答案
不要计算该月的最后一天。而是计算下个月的第一天。
您的查询可以像这样
WHERE t.mydatetimecol >= '2015-05-01'
AND t.mydatetimecol < '2015-05-01' + INTERVAL 1 MONTH
请注意,我们所做的比少,而不是“小于或等于”。。。这对于比较TIMESTAMP和DATETIME列(可以包括时间部分)非常方便。
请注意,
BETWEEN
比较是“小于或等于”。为了获得与上述查询相当的比较结果,我们需要WHERE t.mydatetimecol
BETWEEN '2015-05-01' AND '2015-05-01' + INTERVAL 1 MONTH + INTERVAL -1 SECOND
(这假设
DATETIME
和TIMESTAMP
的分辨率降低到了1秒钟。在其他数据库中,例如SQL Server,该分辨率要优于1秒钟,因此我们有可能会丢失值'2015 -05-31 23:59:59.997'。与下个月第一天的比较相比,我们没有类似的问题... < '2015-06-01'
无需自己进行月份或日期数学运算,让MySQL为您完成。如果您想在月份中加上1,则必须处理从12月到1月的过渡,并增加年份。 MySQL已经内置了所有功能。
关于mysql - 高效的SELECT查询,可在一个月内找到记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30744978/