在我的数据库表中,我有一个日期字段(varchar 字段以 yy-mm-dd 格式保存日期),现在我想选择两周前的记录。我该怎么做 ?
4 回答
MySQL 中的隐式日期算法相当灵活。您可以在不显式使用CAST()
or的情况下将日期作为字符串进行比较DATE()
,但您相信 MySQL 能够正确解释您的格式。幸运的是,它会与yy-mm-dd
.
我建议使用BETWEEN
andINTERVAL
以便您的查询易于阅读;例如:
SELECT * FROM Holidays
WHERE Date BETWEEN (NOW() - INTERVAL 14 DAY) AND NOW();
唯一的技巧BETWEEN
是你必须把下限放在第一位,然后把上限放在第二位;例如,如果你写BETWEEN 5 AND 2
,这总是评估为,FALSE
因为没有值可以大于或等于 5 同时也小于或等于 2。
这是 SQL Fiddle 中的查询演示,以及MySQL中已识别INTERVAL
表达式的列表。
请注意,表达式周围的括号NOW() - INTERVAL 14 DAY
不是必需的,但为了清楚起见,我建议在这里使用它们。它使谓词子句在没有适当的语法突出显示的情况下更容易阅读,但代价是两个字符。
我用它来选择过去的数据
SELECT * FROM Holidays
WHERE a.dDate >= DATE( NOW( ) ) - INTERVAL 14
DAY AND a.dDate <= DATE( NOW( ) ) - INTERVAL 8
理想情况下,您应该使用日期类型来存储日期,但事实并非如此,您应该考虑转换为日期然后进行比较。
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 天前获取。将字符串与日期进行比较将起作用。
SELECT *
FROM your_table
WHERE your_date >= ADDDATE(NOW(), -14) AND your_date < NOW()