【问题标题】:MySQL - select data from database between two datesMySQL - 从两个日期之间的数据库中选择数据
【发布时间】:2012-01-17 12:01:27
【问题描述】:

我已将用户注册的日期保存为日期时间,例如 2011-12-06 10:45:36。我已经运行了这个查询,我预计这个项目 - 2011-12-06 10:45:36 - 将被选中:

SELECT `users`.* FROM `users` WHERE created_at >= '2011-12-01' AND
created_at <= '2011-12-06'

但不是。存在任何优雅的方式,如何选择这个项目?我的第一个想法是2011-12-06 + 1,但这看起来不太好。

【问题讨论】:

    标签: mysql date datetime


    【解决方案1】:

    您的问题是日期的短版本使用午夜作为默认值。所以你的查询实际上是:

    SELECT users.* FROM users 
    WHERE created_at >= '2011-12-01 00:00:00' 
    AND created_at <= '2011-12-06 00:00:00'
    

    这就是为什么您没有看到 10:45 的记录。

    改成:

    SELECT users.* FROM users 
    WHERE created_at >= '2011-12-01' 
    AND created_at <= '2011-12-07'
    

    你也可以使用:

    SELECT users.* from users 
    WHERE created_at >= '2011-12-01' 
    AND created_at <= date_add('2011-12-01', INTERVAL 7 DAY)
    

    这将选择您正在寻找的同一时间间隔内的所有用户。

    您可能还会发现 BETWEEN 运算符更具可读性:

    SELECT users.* from users 
    WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY));
    

    【讨论】:

    • 如果其他人对最后一个示例有疑问,请尝试以下语法:SELECT users.* from users WHERE created_at BETWEEN '2011-12-01' AND date_add('2011-12-01', INTERVAL 7 DAY);
    【解决方案2】:
    SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';
    

    【讨论】:

      【解决方案3】:

      您需要使用“2011-12-07”作为结束点作为没有时间的日期,默认时间为 00:00:00。

      所以你实际写的内容被解释为:

       SELECT users.* 
       FROM   users
       WHERE  created_at >= '2011-12-01 00:00:00' 
         AND  created_at <= '2011-12-06 00:00:00'
      

      您的时间戳是:2011-12-06 10:45:36,这不在这两个点之间。
      也改变这个:

       SELECT users.* 
       FROM   users
       WHERE  created_at >= '2011-12-01'  -- Implied 00:00:00
         AND  created_at <  '2011-12-07'  -- Implied 00:00:00 and smaller than 
                                         --                  thus any time on 06
      

      【讨论】:

      • +1 我想我们在同一时间发布了相同的答案 :-)
      • @dash 实际上 Loki 早在半分钟前就发布了它,他的答案应该是被接受的,但你更幸运。为他 +1 以获得更快的答案,为您 +1 为他 +1。
      【解决方案4】:

      另一种方法是在左侧操作数上使用DATE() 函数,如下所示

      SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06'
      

       

      【讨论】:

        【解决方案5】:

        您是否尝试过之前和之后而不是 >= 和

        【讨论】:

        • 我的不好,之前和之后都来自别的东西。对于时间戳,您需要添加其他人回答的时间和日期。
        【解决方案6】:

        搜索 created_at &lt;= '2011-12-06' 将搜索在 2011 年 12 月 6 日午夜或之前创建的任何记录 .你要搜索created_at &lt; '2011-12-07'

        【讨论】:

          【解决方案7】:

          也许在两者之间使用更好。我得到范围然后过滤它对我有用

          【讨论】:

            【解决方案8】:

            您可以使用 MySQL DATE 函数,如下所示

            例如,如果您想要 2017-09-05 到 2017-09-09 之间的结果

            SELECT DATE(timestamp_field) as date FROM stocks_annc WHERE DATE(timestamp_field) >= '2017-09-05' AND DATE(timestamp_field) <= '2017-09-09'
            

            确保将日期用单引号 '' 括起来

            希望这会有所帮助。

            【讨论】:

              猜你喜欢
              • 2015-07-10
              • 1970-01-01
              • 2013-06-15
              • 2012-10-31
              • 2012-03-03
              • 2012-12-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多