我有一个带有多个日期类型字段的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

(这假设DATETIMETIMESTAMP的分辨率降低到了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/

10-13 08:46
查看更多