我最近获得了一个优化查询,看起来它的功能远远超出了它的需要。
无论如何,查询的一部分对我来说似乎是多余的,我只是想确保它没有做更多我认为它正在做的事情:
WHERE orders.`date` >
DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 MONTH),"%Y-%m-01")
AND DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01")
根据我的理解,第一个DATE_FORMAT()
应该输出上个月的第一个,但是,我无法理解第二个DATE_FORMAT()
函数,因为它已经在第一个中指定了日期???
我的问题是,有人可以在上面说清楚(如果有的话),或者告诉我如何检查MySQL函数的输出?
谢谢!
答案 0 :(得分:2)
要检查此功能的结果,只需执行以下操作:
SELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01");
为了确定这个条件是否真的总是评估为真,只需执行:
SELECT COUNT(*) FROM some_table;
SELECT COUNT(*) FROM some_table
WHERE DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01");
你会看到,两个查询的结果(计数)都是一样的,
看演示: - > http://www.sqlfiddle.com/#!2/03c4d/3
解析阶段的MySql标识常量表达式,并删除计算结果为true的表达式。
详细信息如下所述:http://dev.mysql.com/doc/refman/5.6/en/where-optimizations.html。
要检查MySql是否确实删除了这种情况,请执行以下命令:
EXPLAIN EXTENDED
SELECT * FROM some_table
WHERE DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01");
SHOW WARNINGS;
显示如下内容:
/* select#1 */ select `test`.`some_table`.`x` AS `x`
from `test`.`some_table` where 1
注意where 1
- 查询中的整个条件已简化为1(真)。
答案 1 :(得分:0)
第一个DATE_FORMAT返回上个月的第一个,另一个返回昨天属于的第一个月。
我认为这可能是一个错字 - 如果它是一个范围(例如,BETWEEN)第一个DATE_FORMAT和第二个因此它只返回上个月的数据
是有意义的您可以使用
显示功能的输出SELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),"%Y-%m-01");