对于特定的日期时间,在 [关闭] 之前和之后查找日期时间最近的记录

Posted

技术标签:

【中文标题】对于特定的日期时间,在 [关闭] 之前和之后查找日期时间最近的记录【英文标题】:For a particular datetime, find a record with the closest datetime before and after [closed] 【发布时间】:2021-07-19 08:14:53 【问题描述】:

让我们有一个 mysql 数据库表,其中包含一个 DateTime 列 when。这样的列可以携带除 NULL 之外的任何 DateTime 值。

如何创建一个包含列 whenwhenAwhenB 的表,并且所有全分钟 DateTime 值 (YYYY-MM-DD HH:MM:00) 都在最小值和最大值之间when 值和 whenA 是最接近的 DateTime 或之前,whenB 是最接近的 DateTime 或之后 when 值?如果存在确切的when 值,则whenAwhenB 将与when 相同。如果不存在 on or before 或 on or after 的任何记录,则将 NULL 分别填入whenAwhenB

显然,有很多可能的方法来实现它,但问题是什么应该是最有效的?

【问题讨论】:

【参考方案1】:

您可以使用递归 CTE 构造值。然后你可以使用相关的子查询来得到你想要的:

with recursive cte as (
  select from_unixtime(floor(unix_timestamp(min(whent)) / 60) * 60) as minw,
         max(whent) as maxw
      from t
      union all
      select minw + interval 1 minute, maxw
      from cte
      where minw < maxw
     )
select minw,
       (select max(t2.when)
        from t t2
        where t2.when = cte.minw
       ) as when,
       (select max(t2.when)
        from t t2
        where t2.when <= cte.minw
       ) as when_before,
       (select min(t2.when)
        from t t2
        where t2.when >= cte.minw
       ) as when_after
from cte;

请注意,when 是一个非常糟糕的列名称,因为它是 SQL 关键字和 MySQL 中的保留字。

Here 是一个 dbfiddle。

我应该注意,如果您有某种数字或计数表,也可以使用它。

【讨论】:

以上是关于对于特定的日期时间,在 [关闭] 之前和之后查找日期时间最近的记录的主要内容,如果未能解决你的问题,请参考以下文章

围绕特定日期但年份不断变化的访问查询[关闭]

在特定日期之前查询无值

使用 Apache RewriteRule 和 RewriteCond 将替代内容设置到特定日期 [关闭]

查找下周一的 NSDate [关闭]

如何使用“查找”来搜索在特定日期创建的文件? [关闭]

MySQL从父表中查找创建日期在日期之前和之后的子记录