【发布时间】:2013-09-10 18:08:02
【问题描述】:
在我的数据库表中,我有一个日期字段(varchar 字段以 yy-mm-dd 格式保存日期),现在我想选择两周前的记录。 我该怎么做?
【问题讨论】:
-
你的意思是回到两周并选择那一周发生的任何记录?
-
您要查找的术语是“日期算术”。
标签: mysql select date-arithmetic
在我的数据库表中,我有一个日期字段(varchar 字段以 yy-mm-dd 格式保存日期),现在我想选择两周前的记录。 我该怎么做?
【问题讨论】:
标签: mysql select date-arithmetic
隐式日期算法在 MySQL 中相当灵活。您可以在不显式使用CAST() 或DATE() 的情况下将日期作为字符串进行比较,但您相信MySQL 能够正确解释您的格式。幸运的是,yy-mm-dd 会很好。
我建议使用BETWEEN 和INTERVAL,以便您的查询易于阅读;例如:
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 周围的括号不是必需的,但为了清楚起见,我建议在这里使用它们。在没有适当的语法高亮显示的情况下,它使谓词从句更易于阅读,但代价是两个字符。
【讨论】:
理想情况下,您应该使用日期类型来存储日期,但事实并非如此,您应该考虑转换为日期然后进行比较。
select * from yourtable where cast (yourdate as Date) BETWEEN Date_Add(CURDATE(), INTERVAL -21 Day) and Date_Add(CURDATE(), INTERVAL -14 Day)
请注意,这是未经测试的,可能需要稍作调整,但应该让您大致了解需要做什么。
另外,如果可能的话,你真的应该考虑将 varchar 字段转换为日期字段......他们有日期类型来防止这种事情发生,尽管我知道更改字段类型并不总是可能性。
【讨论】:
您只需使用ADDDATE 即可获得 14 天前的信息。比较 string 和 date 会起作用。
SELECT *
FROM your_table
WHERE your_date >= ADDDATE(NOW(), -14) AND your_date < NOW()
【讨论】:
我用它来选择过去的数据
SELECT * FROM Holidays
WHERE a.dDate >= DATE( NOW( ) ) - INTERVAL 14
DAY AND a.dDate <= DATE( NOW( ) ) - INTERVAL 8
【讨论】: