高效的SELECT查询,可在一个月内查找记录

0pt*_*1z3 9 mysql date

我有一个MySQL DB表,有多个日期类型字段.我需要在此表上执行不同的SELECT查询,但我不确定哪个方法最适合在同一个月查找记录.

我知道我可以做到以下几点:

SELECT *
  FROM table
 WHERE MONTH(somedate) = 5
   AND YEAR(somedate) = 2015
Run Code Online (Sandbox Code Playgroud)

但是我一直在阅读那些效率不高的内容,我应该使用实际日期,即

SELECT *
  FROM table
 WHERE somedate BETWEEN '2015-05-01' AND '2015-05-31'
Run Code Online (Sandbox Code Playgroud)

但是,我所拥有的只是来自PHP的变量的月份和年份.如果我选择第二个选项,如何轻松快速地计算当月的最后一天?

spe*_*593 10

不要计算一个月的最后一天.改为计算下个月的第一天.

您的查询可以是这样的

WHERE t.mydatetimecol >= '2015-05-01'
  AND t.mydatetimecol  < '2015-05-01' + INTERVAL 1 MONTH
Run Code Online (Sandbox Code Playgroud)

请注意,我们做的不是比较,而不是"小于或等于"...这对于比较TIMESTAMP和DATETIME列非常方便,这些列可以包括时间部分.

注意,BETWEEN比较是"小于或等于".要获得与上述查询等效的比较,我们需要这样做

WHERE t.mydatetimecol
      BETWEEN '2015-05-01' AND '2015-05-01' + INTERVAL 1 MONTH + INTERVAL -1 SECOND 
Run Code Online (Sandbox Code Playgroud)

(这假设分辨率为DATETIMETIMESTAMP秒.在其他数据库中,例如SQL Server,分辨率比一秒钟更精细,因此我们有可能错过价值为'2015-05的行-31 23:59:59.997'.我们没有像下一个月的第一天比较那样的问题......< '2015-06-01'

不需要自己做月或日数学,让MySQL为你做.如果您在月份中添加1,则必须处理从12月到1月的翻转,并增加年份.MySQL已经内置了所有内容.