【问题标题】:Select query for two weeks ago选择两周前的查询
【发布时间】:2013-09-10 18:08:02
【问题描述】:

在我的数据库表中,我有一个日期字段(varchar 字段以 yy-mm-dd 格式保存日期),现在我想选择两周前的记录。 我该怎么做?

【问题讨论】:

标签: mysql select date-arithmetic


【解决方案1】:

隐式日期算法在 MySQL 中相当灵活。您可以在不显式使用CAST()DATE() 的情况下将日期作为字符串进行比较,但您相信MySQL 能够正确解释您的格式。幸运的是,yy-mm-dd 会很好。

我建议使用BETWEENINTERVAL,以便您的查询易于阅读;例如:

SELECT * FROM Holidays 
WHERE Date BETWEEN (NOW() - INTERVAL 14 DAY) AND NOW();

BETWEEN 的唯一技巧是你必须先放置下限,然后再放置上限;例如,如果你写BETWEEN 5 AND 2,它的计算结果总是FALSE,因为没有值可以大于或等于5,同时也小于或等于2。

Here's a demo of the query in action at SQL Fiddle,以及 MySQL 中 recognized INTERVAL expressions 的列表。

请注意,表达式 NOW() - INTERVAL 14 DAY 周围的括号不是必需的,但为了清楚起见,我建议在这里使用它们。在没有适当的语法高亮显示的情况下,它使谓词从句更易于阅读,但代价是两个字符。

【讨论】:

    【解决方案2】:

    理想情况下,您应该使用日期类型来存储日期,但事实并非如此,您应该考虑转换为日期然后进行比较。

    select * from yourtable where cast (yourdate as Date) BETWEEN Date_Add(CURDATE(), INTERVAL -21 Day) and Date_Add(CURDATE(), INTERVAL -14 Day)
    

    请注意,这是未经测试的,可能需要稍作调整,但应该让您大致了解需要做什么。

    另外,如果可能的话,你真的应该考虑将 varchar 字段转换为日期字段......他们有日期类型来防止这种事情发生,尽管我知道更改字段类型并不总是可能性。

    【讨论】:

      【解决方案3】:

      您只需使用ADDDATE 即可获得 14 天前的信息。比较 stringdate 会起作用。

      SELECT *
      FROM your_table
      WHERE your_date >= ADDDATE(NOW(), -14) AND your_date < NOW()
      

      【讨论】:

      • 注意,日期存储为 varchar,因此必须先进行转换。
      • 你可以通过 varchar 比较日期
      【解决方案4】:

      我用它来选择过去的数据

      SELECT * FROM Holidays 
      WHERE a.dDate >= DATE( NOW( ) ) - INTERVAL 14
      DAY AND a.dDate <= DATE( NOW( ) ) - INTERVAL 8
      

      【讨论】:

        猜你喜欢
        • 2011-10-04
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-04
        相关资源
        最近更新 更多