我的MySQL数据库表具有以MySQL格式(YYYY-MM-DD)存储的日期。我需要构建一个SQL查询,它将返回日期为今天或昨天或前一天的行。例如,如果存储的日期是1979-08-22,如果今天是8/22(不同年份的同一天)或8/23或8/24,我希望返回此行。
我正在考虑使用DAYOFYEAR()函数,它根据日期返回1到365之间的单个值。这是当前的查询:
SELECT * FROM `theTable` WHERE DAYOFYEAR(CURDATE())-DAYOFYEAR(`theDate`) IN(0, 1, 2, -364, -363)
此查询查找当前日期与存储日期之间的天数差异,如果是3天,则应返回结果。它似乎有效。
这是实现我想要的结果的正确方法还是有另一种更有效的方法?这可能会导致闰年问题吗?
答案 0 :(得分:1)
select *,
if(right(date_field,5)<=right(curdate(),5),concat(year(curdate()),'-',right(date_field,5)),concat(year(curdate() - interval 1 year),'-',right(date_field,5))) as myfield
from table
having myfield between curdate() - interval 2 day and curdate()
答案 1 :(得分:1)
如果在where子句上使用mysql函数,优化器不能在该字段上使用索引(如果有索引)
您可以使用EXPLAIN命令
检查优化器将如何处理您的查询EXPLAIN SELECT * FROM `theTable` WHERE DAYOFYEAR(CURDATE())-DAYOFYEAR(`theDate`) IN(0, 1, 2, -364, -363)
如果桌子很小而且不会增长而你不关心性能,你不必担心。
我会在DATETIME字段旁边添加一个新的VARCHAR字段,我会在此字段中存储相同的信息,但顺序不同
DATETIME: 2011-01-01
VARCHAR: 01-01-2011
我会在varchar字段上创建一个索引,这样你就可以运行快速简单的提取查询,如
SELECT * FROM `theTable` WHERE `varchar_date` LIKE '01-01-%'
答案 2 :(得分:1)
它具体必须是今天,昨天还是前一天 - 或者最后72小时也可以吗?
SELECT * FROM foo WHERE UNIX_TIMESTAMP(field) BETWEEB CURRENT_TIMESTAMP - 259200 AND CURRENT_TIMESTAMP
更新似乎我完全错过了关于多年不同的部分...另一种可能的解决方案(适用于日差异而非小时)我作为评论添加{{1 }}
答案 3 :(得分:1)
这似乎比它需要的更难。有什么问题:
WHERE thedate >= DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY)
如果未来日期可能,则需要附加条款:AND thedate <= CURRENT_DATE()
像字符串一样处理日期并尝试做数学是危险的。闰年,闰秒,年末边缘情况等都会导致问题。如果有一个内置的库可以解决你的问题,你最好不要使用它,而不是自己动手。
答案 4 :(得分:0)
SELECT * FROM `datesTable`
WHERE (
MONTH(`theDate`) = MONTH(CURDATE())
AND DAY(`theDate`) = DAY(CURDATE())
) OR (
MONTH(`theDate`) = MONTH(DATE_ADD(CURDATE(), INTERVAL -1 DAY))
AND DAY(`theDate`) = DAY(DATE_ADD(CURDATE(), INTERVAL -1 DAY))
) OR (
MONTH(`theDate`) = MONTH(DATE_ADD(CURDATE(), INTERVAL -2 DAY))
AND DAY(`theDate`) = DAY(DATE_ADD(CURDATE(), INTERVAL -2 DAY))
)
完成!