MySQL查询 - 今天和过去30天之间的记录

Jas*_*eet 112 mysql select date

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

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 
Run Code Online (Sandbox Code Playgroud)

我的陈述未能将记录限制在过去30天 - 它选择所有记录.

谁能指出我正确的方向?感觉就像我很亲密.

谢谢,祝你有个愉快的一周.

Qua*_*noi 262

您需要DATE_FORMATSELECT条款中申请,而不是WHERE条款:

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

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

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

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

  • 这个答案的第二部分非常重要!我可能遇到过这个问题,也可能没有遇到过这个问题,直到我回到这个答案之前,我一直在挠头。 (2认同)

小智 54

SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
Run Code Online (Sandbox Code Playgroud)

  • 我不会撒谎-那是2年前,我不记得了!抱歉:P (3认同)
  • 我更喜欢这种方法在BETWEEN CURDATE() - INTERVAL 30之间 (2认同)
  • 无需使用 `DATE_FORMAT(create_date, '%m/%d/%Y')` (2认同)

Ric*_*ams 10

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()
Run Code Online (Sandbox Code Playgroud)


Roh*_*har 8

你也可以在mysql中写这个 -

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

  • 同意,应为WHERE create_date&gt; DATE_ADD(NOW(),INTERVAL -1 MONTH); (4认同)
  • 当心:尽管投票增加了,但这会选择*接下来* 30天/月的日期,而不是*最近* 30天的日期! (2认同)

小智 6

对于当前日期活动和前30天的完整活动,请使用此项,因为SYSDATE在一天中变量,前30天将不具有该日的整个数据.

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