2013-05-10 66 views
1

我有一个包含日期列的表。MySQL SELECT WHERE DATE约为X天前

表格数据通过cron作业以不规则间隔插入,而不是每天插入。

我想只选择最接近X天前的行。

因此,例如,如果它的6月30日和6月25日没有条目,我希望它能够在6月26日或24日(以5天前最新和最近的时间为准)在26日或24日没有条目,然后查找27日或23日等...

日期存储为YYYY-MM-DD HH:MM:SS。

任何帮助是非常赞赏:)

+0

你可以使用between语句'WHERE date BETWEEN x ... y' – Matthew 2013-05-10 17:52:27

+0

@Matthew在我收到反馈之前,我发布了一个答案,反对在DATE,DATETIME和TIMESTAMP列上使用BETWEEN。我建议你阅读这篇文章:http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx – Barranka 2013-05-10 18:15:13

+0

@Barranka The在那篇文章中,我只能用'between'看到的问题是作者不明白日期是如何工作的。 – Matthew 2013-05-10 21:03:08

回答

1

假设TIMESTAMP列insertion_ts?必将给您想要的日期或时间戳:

SELECT * 
    FROM tbl 
ORDER BY 
     -- We want the closest insertion_ts to our target date ... 
     ABS(TIMESTAMPDIFF(SECOND, ?, insertion_ts)) ASC, 
     -- ... and will favor the more recent in the unlikely event of a tie 
     TIMESTAMPDIFF(SECOND, ?, insertion_ts) DESC 
    LIMIT 1; 
+0

aww,你的更好 – 2013-05-10 17:59:45

+0

谢谢pilcrow!一直试图找出这一点,堆栈溢出的第一篇文章在5分钟内回答:) – 2013-05-10 18:13:09

+0

@IanT,不客气。请务必在未来回复更多问答! :) – pilcrow 2013-05-10 18:20:43

0

喜欢的东西:

SELECT id, date, .... 
FROM  tbl 
WHERE date <= [your date YYYY-MM-DD HH:MM:SS] 
ORDER BY date DESC 
LIMIT 1 
+0

那不行: OP想要“最近”的时间戳到期望的日期,而不是最近的时间戳在期望的日期之前。 – pilcrow 2013-05-10 18:13:33

0
SELECT * 
FROM `table` 
ORDER BY ABS(DATEDIFF(`date`, (DATE_SUB(NOW(), INTERVAL X DAY)))) ASC 
LIMIT 1