【问题标题】:STR_TO_DATE() vs CONSTANT when comparing DATETIME field比较 DATETIME 字段时的 STR_TO_DATE() 与 CONSTANT
【发布时间】:2015-06-02 14:00:25
【问题描述】:

有一个名为“created_at”的带有DATETIME 字段的表。 我尝试执行两个这样的查询:

  1. SELECT * FROM myTable WHERE created_at BETWEEN '2015-03-15 10:25:00' AND '2015-03-25 10:30:00';
  2. 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 datetime comparison str-to-date


    【解决方案1】:

    我更喜欢直接放入常量。我相信 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'
    

    如果你认为你有两个约会,那你就错了。您将获得第一天的所有日期时间加上第二天的午夜。

    【讨论】:

      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2014-08-20
      • 2014-10-02
      • 2011-02-15
      • 1970-01-01
      • 2016-02-24
      相关资源
      最近更新 更多