【问题标题】:MySQL SELECT WHERE DATE is approx X days agoMySQL SELECT WHERE DATE 大约是 X 天前
【发布时间】:2013-05-05 11:31:49
【问题描述】:

我有一个包含日期列的表格。

表格数据通过 cron 作业不定期插入,而不是每天插入。

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

因此,例如,如果它是 6 月 30 日并且没有 6 月 25 日的条目,我希望它从 6 月 26 日或 24 日(以最新且最接近 5 天前的时间为准)获取条目,如果没有26 日或 24 日的条目然后寻找 27 日或 23 日等...

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

非常感谢任何帮助:)

【问题讨论】:

  • 你可以使用 between 语句WHERE date BETWEEN x ... y
  • @Matthew 在我收到反对在 DATEDATETIMETIMESTAMP 列上使用 BETWEEN 的反馈之前发布的一个答案。我建议你阅读这篇文章:sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/…
  • @Barranka 我在那篇文章中看到between 的唯一问题是作者不了解日期的工作原理。
  • @Matthew 考虑到作者的经验,值得考虑(不知何故,我认为作者确实了解他的东西)。无论如何,对于关键任务,仔细检查结果总是一个好主意。如果datetime 值包括小时、分钟和秒,则类似t between '2013-01-01' and '2013-01-05' 的表达式将排除(严格)大于2013-01-05 00:00:00 的每个t 值(例如:2013-01-05 00:00:01) ...这很可能不是我们想要的

标签: mysql


【解决方案1】:

类似:

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

【讨论】:

  • 那不行:OP 想要“最近”的时间戳到所需日期,而不是所需日期之前的最近时间戳。
【解决方案2】:

假设 TIMESTAMP 列是 insertion_ts 并且 ? 绑定到您想要的 DATE 或 TIMESTAMP:

   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;

【讨论】:

  • 感谢 pilcrow!一段时间以来一直试图解决这个问题,关于堆栈溢出的第 1 篇文章在 5 分钟内得到了答复 :)
  • @IanT,不客气。以后一定要回来做更多的问答! :)
【解决方案3】:
SELECT *
FROM `table`
ORDER BY ABS(DATEDIFF(`date`, (DATE_SUB(NOW(), INTERVAL X DAY)))) ASC
LIMIT 1

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    相关资源
    最近更新 更多