MySQL日期函数 - 你可以在没有查询的情况下检查它们的输出

时间:2013-12-12 11:39:12

标签: mysql sql

我最近获得了一个优化查询,看起来它的功能远远超出了它的需要。

无论如何,查询的一部分对我来说似乎是多余的,我只是想确保它没有做更多我认为它正在做的事情:

    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函数的输出?

谢谢!

2 个答案:

答案 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");