mysql - 查询日期 : is "dateval LIKE ' 2014-01-01 %'" a best practice?

标签 mysql sql datetime date-range query-performance

<分区>

This答案建议使用大于/小于来查询与给定日期匹配的日期。但是我公司的一位资深人士告诉我使用 LIKE '2014-02-06%'

最佳做法是什么?两者之间有什么明显的优势吗?

最佳答案

当您在此上下文中使用 LIKE 时,您是在(隐式地和不可见地)将 DATE、TIMESTAMP 或 DATETIME 列值类型转换为字符串,然后将该字符串与您提到的模式进行比较。类型转换操作最终会阻止对列值使用任何索引。应用于 WHERE 子句中的列值的任何函数也是如此。

因此,您的同事得到的结果是正确的。但是他们得到它的速度比他们需要的要慢得多,因为他们使用全表扫描而不是 index range scan。 .

顺便说一句,BETWEEN 对 DATE 列有效,但对 DATETIME 或 TIMESTAMP 列无效。要从后两个日期中选择一个日期,您需要

WHERE dateval >= '2014-02-06'
  AND dateval <  '2014-02-06' + INTERVAL 1 DAY

问题是

WHERE dateval BETWEEN '2014-02-06'  /* wrong! */
                  AND '2014-02-06' + INTERVAL 1 DAY

在您想要的次日午夜恰好拾取 dateval 项目。两种公式都对索引使用范围扫描,这使得它们速度很快。但是 BETWEEN 可能会得到错误的结果。

关于mysql - 查询日期 : is "dateval LIKE ' 2014-01-01 %'" a best practice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21676514/

相关文章:

mysql - 应用错误 1677 : Column 59 of table `sales_orders` cannot be converted from type `datetime` to type `varchar(10)`

mysql - LightSwitch + MySQL 错误 : Nested Transactions are not supported

sql - PostgreSQL,从 2 个表中选择,但仅从表 2 中选择最新元素

mysql - SELECT AVG 仅显示一个结果

C# DateTime.TryParse 相同格式,不同日期

PHP fatal error : Call to a member function execute() on a non-object

mysql - 对包含数字和其他非字母字符的 varchar 列进行排序

c# - System.DateTime.Year(及其其他属性)是如何实现的?

angular - date.getDate 不是函数 Typescript

php - 计算关系表条目