【问题标题】:How to get the records from last 60th day to previous days [closed]如何获取过去 60 天到前几天的记录 [关闭]
【发布时间】:2013-05-17 05:12:42
【问题描述】:

我想获取所有超过 60 天的记录。我有 create_date 列,请提出满足上述要求的查询

SELECT * FROM mytable WHERE create_date BETWEEN  DATE_SUB(NOW(), INTERVAL 60 DAY)  AND create_date >'60days'

收到我的询问

正确的查询是

SELECT * FROM mytable WHERE create_date < DATE_SUB(NOW(), INTERVAL 60 DAY);

【问题讨论】:

  • 你至少需要尝试一下..
  • 是的,我已经尝试过,但没有成功
  • 如果你展示了你尝试过的东西,那么你可能会得到一些帮助
  • 如果 create_dateDATE,那么您使用 create_date &gt;'60days' 进行的编辑毫无意义 - 您无法将日期与时间间隔进行比较

标签: mysql


【解决方案1】:

在 SQL 中,表达式

x BETWEEN a AND b

字面意思

a <= x AND x <= b

如果a &gt; b,无论如何都会产生空结果。

换句话说,顺序很重要 - 只需确保在使用 x BETWEEN a AND b 时,a 必须是 b。

对你来说,这意味着交换日期(并修复一些其他错误):

SELECT * FROM mytable
WHERE create_date BETWEEN '2011-10-14'
          AND NOW() - INTERVAL 60 DAY

更新:关于使用函数DATE_SUB()DATE_ADD() 的更多说明。

一般来说,如果你需要在大表中比较日期,你应该不惜一切代价避免使用这些功能!现代 MySQL 支持使用标准 +- 运算符的日期算术,所以表达式

DATE_SUB(create_date, INTERVAL 60 DAY)

等价于

create_date - INTERVAL 60 DAY

这不仅更易于阅读,而且还允许服务器利用您为create_date 列创建的可能索引。这种加速不能应用于任何函数调用,如DATE_SUB() - MySQL 不支持函数索引。

【讨论】:

  • 更新答案 - 如果可以,请避免使用 DATE_SUB()
【解决方案2】:

试试类似的东西

select * from tablename where datediff(now(), date) > 60

我假设date 存储在名为date 的列中,您使用列名而不是date

希望它有效。

【讨论】:

  • 如果表很大,这个查询会很慢。索引无济于事
  • 没有使用上述查询获取记录
  • 也请查看我的更新答案。
  • 得到了我的查询 SELECT * FROM mytable where created_date
  • 我提到的查询也会给你同样的结果..