【问题标题】:MySQL Query - Records between Today and Last 30 DaysMySQL 查询 - 今天和过去 30 天之间的记录
【发布时间】:2011-01-03 17:40:40
【问题描述】:

我想返回过去 30 天内添加到数据库的所有记录。由于显示目的,我需要将日期转换为 mm/dd/yy。

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 

我的语句未能将记录限制为过去 30 天 - 它选择了所有记录。

谁能指出我正确的方向?感觉就像我很接近。

谢谢,祝您度过愉快的一周。

【问题讨论】:

    标签: mysql date select


    【解决方案1】:

    您需要在SELECT 子句中应用DATE_FORMAT,而不是WHERE 子句:

    SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
    FROM    mytable
    WHERE   create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()
    

    另请注意,CURDATE() 仅返回日期的 DATE 部分,因此如果您将 create_date 存储为 DATETIME 并填充了时间部分,此查询将不会选择今天的记录。

    在这种情况下,您需要改用NOW

    SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
    FROM    mytable
    WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
    

    【讨论】:

    • 这个答案的第二部分非常重要!我可能有也可能没有这个问题,我一直在摸索,直到我回到这个答案。
    • @Quassnoi 对不起。这似乎只是 WordPress \wpdb 准备问题。再次抱歉。
    【解决方案2】:

    DATE_FORMAT 返回一个字符串,因此您在 BETWEEN 子句中使用了两个字符串,这不会像您预期的那样工作。

    相反,将日期转换为SELECT 中的格式,并为实际日期执行BETWEEN。例如,

    SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted
    FROM table
    WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE()
    

    【讨论】:

      【解决方案3】:
      SELECT
          *
      FROM
          < table_name >
      WHERE
          < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
      AND NOW();
      

      【讨论】:

      • 我更喜欢这种方法而不是 BETWEEN CURDATE() - INTERVAL 30
      • @Erm所以我能知道为什么吗?
      • 我不会撒谎——那是两年前的事了,我不记得了!对不起:P
      • 不用DATE_FORMAT(create_date, '%m/%d/%Y')
      • @Dan 我更喜欢通过将前一个日期括在括号中来使其更具可读性:... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
      【解决方案4】:

      对于当前日期活动和前 30 天的完整活动,请使用此选项,因为 SYSDATE 在一天中是可变的,因此前 30 天不会有当天的全部数据。

      SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
      FROM mytable
      WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()
      

      【讨论】:

        【解决方案5】:

        你也可以在mysql里写这个——

        SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
        FROM    mytable
        WHERE   create_date < DATE_ADD(NOW(), INTERVAL -1 MONTH);
        

        已修复

        【讨论】:

        • 当心:尽管有赞成票,但这会选择每月下一个 30天的日期,而不是最后 30天的日期!
        • 同意,应该是 WHERE create_date > DATE_ADD(NOW(), INTERVAL -1 MONTH);
        【解决方案6】:

        这是一个不使用curdate()函数的解决方案,我猜这是为那些使用TSQL的人提供的解决方案

        SELECT myDate
        FROM myTable
        WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
        

        【讨论】:

          最近更新 更多