查询日期:“dateval LIKE '2014-01-01%'”是最佳实践吗? [复制]

Posted

技术标签:

【中文标题】查询日期:“dateval LIKE \'2014-01-01%\'”是最佳实践吗? [复制]【英文标题】:Querying dates: is "dateval LIKE '2014-01-01%'" a best practice? [duplicate]查询日期:“dateval LIKE '2014-01-01%'”是最佳实践吗? [复制] 【发布时间】:2014-03-07 17:50:29 【问题描述】:

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

最佳做法是什么?两者相比有什么显着优势吗?

【问题讨论】:

*** 中的答案是正确的。 @GordonLinoff 是否正确只是因为在 SO 中还是有任何其他原因? 。 .接受的答案中的逻辑是正确的。转换为字符串是不必要的开销,并且会阻止使用索引。 【参考方案1】:

当您在此上下文中使用 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 可能会得到错误的结果。

【讨论】:

【参考方案2】:

如果您在日期字段上使用LIKE 查询,这不是一个好主意,它将计算所有日期的日期的字符串表示形式。但是,如果您使用BETWEEEN 运算符,它只会将时间戳的 int 值与存储的数据进行比较。

【讨论】:

以上是关于查询日期:“dateval LIKE '2014-01-01%'”是最佳实践吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Accessoft-日期区间段查询示例,开始日期至截止日期区段查询

SQL中按日期进行查询,如何截取日期进行查询

编写一个查询,该查询将在两个设定日期之间运行所有日期和日期的名称[重复]

thinkphp中如何通过日期查询数据库

MYSQL怎么查询两个时间之间的日期列表

sql 查询时间、日期范围内的数据