查询日期:“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-日期区间段查询示例,开始日期至截止日期区段查询