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

时间:2015-06-10 00:08:45

标签: php mysql date

我有一个包含多个日期类型字段的MySQL数据库表。我需要在此表上执行不同的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的变量的月份和年份。如果我选择第二个选项,如何轻松快速地计算当月的最后一天?

2 个答案:

答案 0 :(得分:10)

不要计算一个月的最后一天。相反,计算下个月的第一天。

您的查询可以是这样的

WHERE t.mydatetimecol >= '2015-05-01'
  AND t.mydatetimecol  < '2015-05-01' + INTERVAL 1 MONTH

请注意,我们正在进行小于的比较,而不是&#34;小于或等于&#34; ...这对于比较TIMESTAMP和DATETIME列非常方便,可以包括时间部分。

请注意,BETWEEN比较是&#34;小于或等于&#34;。要获得与上述查询等效的比较,我们需要执行

WHERE t.mydatetimecol
      BETWEEN '2015-05-01' AND '2015-05-01' + INTERVAL 1 MONTH + INTERVAL -1 SECOND 

(这假设DATETIMETIMESTAMP的分辨率低至一秒。在其他数据库(如SQL Server)中,分辨率比一秒钟更精细,因此我们可以使用d有可能错过价值为“2015-05-31 23:59:59.997”的行。我们不会遇到这样的问题,因为这个问题比第一天少。下个月比较... < '2015-06-01'

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

答案 1 :(得分:3)

date('t', strtotime("$year-$month-01"))将在一个月内提供日期