【问题标题】:MySQL - Returning rows between two dates/timesMySQL - 返回两个日期/时间之间的行
【发布时间】:2013-01-16 08:01:17
【问题描述】:

我正在使用的 MySQL 表将日期和时间作为单独的列。日期的格式为"y-m-d""hh:mm:ss" 时间。如果它们在不同的日子里,我该如何准确地搜索两次之间的行? (例如2013-01-15 12:00:002013-01-17 17:00:00之间的行)

目前,我正在使用一种糟糕的解决方法,假设时差最多为一天,但情况并非总是如此。可能有一种简单的方法可以做到这一点,但我就是不知道是什么。谢谢!

【问题讨论】:

  • 您不能更改架构以将列组合成单个DATETIMETIMESTAMP 类型列吗?
  • 强烈建议您将数据修改为 DATETIME。
  • 这样真的快很多吗?更改表需要很长时间,因为很多机器都在使用这种结构写入数据库,但如果它真的会有所作为,我可能会要求进行更改。

标签: php mysql sql date


【解决方案1】:

使用CONCAT连接字段

SELECT  *
FROM    tableName
WHERE   CONCAT(dateCol, ' ', timeColumn) BETWEEN
            '2013-01-15 12:00:00' AND '2013-01-17 17:00:00'

但我建议您(如果可能)通过将数据类型为 DateTime 的两列组合来更改表,以便您可以利用索引。上面使用CONCAT 的查询需要full table scan,这对于大型数据库来说性能很差。

【讨论】:

    【解决方案2】:

    JW. 的答案可以通过首先使用索引缩小搜索空间,然后将结果缩减到正确的集合来加快速度。

    select * from births
    where date between '2013-01-15' and '2013-01-17' -- use index
    and concat(date, ' ', time) between '2013-01-15 12:00:00' and '2013-01-17 17:00:00' 
    ;
    

    查看SQL Fiddle了解更多详情。

    【讨论】:

    • 非常感谢你们俩!我使用的表确实很大,这个索引使它工作合理。
    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 2012-06-03
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多