用于在日期字段中选择当前月的SQL,然后仅在当前日期大于特定日期时使用

时间:2014-10-12 01:23:13

标签: mysql sql

这个带有mysql db的sql不起作用:

SELECT *
FROM `house1_rent_2014` 
WHERE MONTH( `FIRST_OF_MONTH` ) = MONTH( NOW() )
AND DATE_ADD(MONTH(`FIRST_OF_MONTH`,INTERVAL 15 DAY) <= CURDATE();

我想要做的是从FIRST_OF_MONTH列中获取所有当前月份的值(单独运行正常),然后添加额外的测试,如果它是当前月份值当前的日期字段和今天&# 39; s日期大于当前月份的15日,然后选择该日期。换句话说,如果今天是9/15或更晚,则字段有2014-09-01(再次,我只想要当前月份的日期字段),然后选择它。

我混淆了语法和可能正确的逻辑。感谢帮助

1 个答案:

答案 0 :(得分:1)

你所拥有的语法比它需要的更复杂,我认为规范也过于混乱。

&#34;从FIRST_OF_MONTH&#34;

列中获取所有当前月份值

您是否也希望从去年9月起返回值? (MONTH()函数仅返回月份值(1到12),并且不包括年份,这看起来有点奇怪。

要获取&#34;当前月份&#34;的行,我们通常会执行以下操作:

 WHERE t.first_of_month >= DATE_FORMAT(NOW(),'%Y-%m-01') 
   AND t.first_of_month <  DATE_FORMAT(NOW(),'%Y-%m-01') + INTERVAL 1 MONTH

在&#34;裸列上预测&#34;允许MySQL有效地使用索引,在这种情况下,使用first_of_month的前导列对索引进行范围扫描。如果我们将这些列包装在一个函数中,那么MySQL必须在表的每一行上评估函数。

&#34;然后在日期字段中添加额外的测试,如果它是当前月值,今天的日期大于15的日期当前月份然后选择那个。&#34;

您已经有一个谓词检查&#34;当前月份&#34;中的日期,无需重复该日期。

如果当前日期在15日之后,此谓词将评估为TRUE,如果当前日期是15日或更早,则该评估将返回FALSE。

   AND DATE(NOW()) > DATE_FORMAT(NOW(),'%Y-%m-15')

实施例

如果我们在表格中有这些行:

row  first_of_month
---  --------------
  1  2014-09-30
  2  2014-10-02
  3  2014-10-14
  4  2014-10-16
  5  2014-10-31
  6  2014-11-01

如果我们使用这些谓词运行查询:

 WHERE t.first_of_month >= DATE_FORMAT(NOW(),'%Y-%m-01') 
   AND t.first_of_month <  DATE_FORMAT(NOW(),'%Y-%m-01') + INTERVAL 1 MONTH
   AND DATE(NOW()) > DATE_FORMAT(NOW(),'%Y-%m-15')

如果DATE(NOW())返回'2014-10-11',则第三个谓词将评估为FALSE,并且不会返回任何行。

如果DATE(NOW())返回'2014-10-16',则返回当前月份中first_of_month的所有行,即示例数据中的第2行到第5行。

如果DATE(NOW())返回'2014-11-07',则第三个谓词为false,并且不返回任何行。

如果DATE(NOW())返回'2014-09-25',则查询将返回示例数据中的第1行。