【问题标题】:Datetime equal or greater than today in MySQL日期时间等于或大于 MySQL 中的今天
【发布时间】:2011-07-08 03:00:10
【问题描述】:

以下最好的方法是:

SELECT * FROM users WHERE created >= today;

注意:created 是一个日期时间字段。

【问题讨论】:

    标签: mysql sql datetime


    【解决方案1】:
    SELECT * FROM users WHERE created >= NOW();
    

    如果列是日期时间类型。

    【讨论】:

    • 我的意思是今天不是现在:我今天需要像 2011-03-03 而不是 2011-03-03 14:02:02
    • @n00b: 它将返回大于今天的行数,如果包括时间,请不要担心
    • 可以说是 2011-02-02 14:02:02 - 在 10:02:02 创建的用户不会在您的版本中返回,即使他们是“今天”创建的: )
    • @n00b: 哈哈,只要我们能停止时间,就不会返回任何用户。
    【解决方案2】:
    SELECT * FROM users WHERE created >= CURDATE();
    

    但我认为你的意思是created < today

    【讨论】:

    • CURDATE() 只返回日期而不是时间
    • @n00b 您如何拥有未来创建的用户..?有趣 =) 我正在使用它来查看帖子是否已过期。
    【解决方案3】:
    SELECT * FROM users WHERE created >= now()
    

    【讨论】:

    • 这不会从今天开始返回此时刻之前的记录。
    【解决方案4】:
    SELECT * FROM myTable WHERE  DATE(myDate) = DATE(NOW())
    

    阅读更多: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html

    【讨论】:

    • 也许我遗漏了一些东西,但是对于 DATETIME 类型,CURDATE() 解决方案不起作用。确实如此。
    • 加上这需要很多时间,因为通过 DATE() 函数将 DATETIME 转换为日期然后与 where 条件进行比较会产生开销。
    • 不要在列上使用函数,这会使查询忽略索引,导致查询慢。检查我对替代方法的回答stackoverflow.com/a/42365426/4311336
    【解决方案5】:

    如果'created'是日期时间类型

    SELECT * FROM users WHERE created < DATE_ADD(CURDATE(), INTERVAL 1 DAY);
    

    CURDATE() 也表示 '2013-05-09 00:00:00'

    【讨论】:

    • 谢谢。我实际上需要 DATE_SUB(以相同的方式使用),但这让我走上了正确的道路。
    • 这将不会返回日期包含时间 0 的数据,即 '2013-05-09 00:00:00' 将被遗漏
    【解决方案6】:

    你可以返回所有行,而不是在 if 语句中使用 php datediff 函数,尽管这会给服务器带来额外的负载。

    if(dateDiff(date("Y/m/d"), $row['date']) <=0 ){    
    }else{    
    echo " info here";    
    }
    

    【讨论】:

    • 这与数据库选择相比非常慢
    【解决方案7】:
    SELECT * FROM table_name WHERE CONCAT( SUBSTRING(json_date, 11, 4 ) ,  '-', SUBSTRING( json_date, 7, 2 ) ,  '-', SUBSTRING(json_date, 3, 2 ) ) >= NOW();
    

    json_date ["05/11/2011"]

    【讨论】:

    • 这是一个非常原始的解决方案
    【解决方案8】:

    下面的代码对我有用。

    declare @Today date
    
    Set @Today=getdate() --date will equal today    
    
    Select *
    
    FROM table_name
    WHERE created <= @Today
    

    【讨论】:

      【解决方案9】:

      如果列有索引并且在列上应用了函数,则索引不起作用并发生全表扫描,导致查询非常慢。

      错误查询;这将忽略 date_time 列上的索引

      select * from users
      where Date(date_time) > '2010-10-10'
      

      要利用 datetime 类型的列 created 上的索引与今天/当前日期进行比较,可以使用以下方法。

      OP 解决方案:

      select * from users
      where created > CONCAT(CURDATE(), ' 23:59:59')
      

      获取今天数据的样本:

      select * from users
      where 
          created >= CONCAT(CURDATE(), ' 00:00:00') AND
          created <= CONCAT(CURDATE(), ' 23:59:59')
      

      或简称 BETWEEN

      select * from users 
      where created BETWEEN 
            CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59')
      

      提示: 如果您必须对日期和时间进行大量计算或查询,那么将日期和时间保存在单独的列中非常有用。 (分而治之)

      【讨论】:

        【解决方案10】:

        标记的答案具有误导性。提出的问题是DateTime,但表示需要的只是CURDATE()

        对此的最短且正确的答案是:

        SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-28
          • 2017-08-14
          • 2015-12-15
          • 1970-01-01
          • 2012-09-22
          • 1970-01-01
          • 2019-10-30
          • 1970-01-01
          相关资源
          最近更新 更多