这个带有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(再次,我只想要当前月份的日期字段),然后选择它。
我混淆了语法和可能正确的逻辑。感谢帮助
答案 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行。