STR_TO_DATE() 与 CONSTANT 比较 DATETIME 字段时
STR_TO_DATE() vs CONSTANT when comparing DATETIME field
有一个 table 和 DATETIME
字段,名为 'created_at'。
我尝试执行两个这样的查询:
SELECT * FROM myTable WHERE created_at BETWEEN '2015-03-15 10:25:00' AND '2015-03-25 10:30:00';
SELECT * FROM myTable WHERE created_at BETWEEN
STR_TO_DATE('2015-03-15 10:25:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2015-03-25 10:30:00', '%Y-%m-%d %H:%i:%s');
我一直使用第一种查询,但最近看到一篇文章,其中描述了第二种方法是比较的最佳方法 DATETIME
。不幸的是,它不包含任何解释为什么这种方法是最好的方法。
现在,我有一些问题:
- 这两种方法有什么区别吗?
- 哪种方式更可取?
谢谢!
我更喜欢直接把常量放进去。我相信 MySQL 只会为查询处理一次 str_to_date()
函数,因为参数是常量。但是,我不喜欢依赖这种优化。
str_to_date()
的优点是它应该独立于国际化设置,因此结果应该是明确的。但是,使用ISO标准格式应该是等价的,那就是你常量的结构。
但是,除此之外,编写查询的更好方法是:
SELECT *
FROM myTabl
WHERE created_at >= '2015-03-15 10:25:00' AND
created_at < '2015-03-25 10:30:00'
我猜您并不是真的想要间隔 10 天 5 分 1 秒,而是想要正好 10 天 5 分钟。在任何情况下,将 between
与日期和日期时间一起使用可能会导致意外结果,尤其是当您执行以下操作时:
where datetime between '2015-03-15' and '2015-03-16'
如果你认为你得到了两个日期,那你就错了。您将获得第一天的所有日期时间加上第二天的午夜。
有一个 table 和 DATETIME
字段,名为 'created_at'。
我尝试执行两个这样的查询:
SELECT * FROM myTable WHERE created_at BETWEEN '2015-03-15 10:25:00' AND '2015-03-25 10:30:00';
SELECT * FROM myTable WHERE created_at BETWEEN STR_TO_DATE('2015-03-15 10:25:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2015-03-25 10:30:00', '%Y-%m-%d %H:%i:%s');
我一直使用第一种查询,但最近看到一篇文章,其中描述了第二种方法是比较的最佳方法 DATETIME
。不幸的是,它不包含任何解释为什么这种方法是最好的方法。
现在,我有一些问题:
- 这两种方法有什么区别吗?
- 哪种方式更可取?
谢谢!
我更喜欢直接把常量放进去。我相信 MySQL 只会为查询处理一次 str_to_date()
函数,因为参数是常量。但是,我不喜欢依赖这种优化。
str_to_date()
的优点是它应该独立于国际化设置,因此结果应该是明确的。但是,使用ISO标准格式应该是等价的,那就是你常量的结构。
但是,除此之外,编写查询的更好方法是:
SELECT *
FROM myTabl
WHERE created_at >= '2015-03-15 10:25:00' AND
created_at < '2015-03-25 10:30:00'
我猜您并不是真的想要间隔 10 天 5 分 1 秒,而是想要正好 10 天 5 分钟。在任何情况下,将 between
与日期和日期时间一起使用可能会导致意外结果,尤其是当您执行以下操作时:
where datetime between '2015-03-15' and '2015-03-16'
如果你认为你得到了两个日期,那你就错了。您将获得第一天的所有日期时间加上第二天的午夜。