对于特定的日期时间,在 [关闭] 之前和之后查找日期时间最近的记录
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 值。
如何创建一个包含列 when
、whenA
和 whenB
的表,并且所有全分钟 DateTime 值 (YYYY-MM-DD HH:MM:00) 都在最小值和最大值之间when
值和 whenA
是最接近的 DateTime 或之前,whenB
是最接近的 DateTime 或之后 when
值?如果存在确切的when
值,则whenA
和whenB
将与when
相同。如果不存在 on or before 或 on or after 的任何记录,则将 NULL 分别填入whenA
或whenB
。
显然,有很多可能的方法来实现它,但问题是什么应该是最有效的?
【问题讨论】:
【参考方案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。
我应该注意,如果您有某种数字或计数表,也可以使用它。
【讨论】:
以上是关于对于特定的日期时间,在 [关闭] 之前和之后查找日期时间最近的记录的主要内容,如果未能解决你的问题,请参考以下文章