如何获取日期为今天或昨天或前一天在MySQL中的行?

时间:2011-08-16 19:05:26

标签: mysql

我的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天,则应返回结果。它似乎有效。

这是实现我想要的结果的正确方法还是有另一种更有效的方法?这可能会导致闰年问题吗?

5 个答案:

答案 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))
    )

完成!