mysql - 对于特定的日期时间,查找前后日期时间最近的记录
问题描述
让我们有一个包含 DateTime 列的 MySQL 数据库表when
。这样的列可以携带除 NULL 之外的任何 DateTime 值。
如何创建一个包含 、 和 列的表when
,whenA
其中whenB
所有全分钟 DateTime 值 (YYYY-MM-DD HH:MM:00) 在最小值和最大值之间,when
并且whenA
是最接近的 DateTime 或之前,并且whenB
是值上或之后最接近的日期时间when
?如果存在确切的when
值,whenA
并且whenB
将与 相同when
。如果不存在 on 或 before 或 on 或 after 的记录,则 NULL 将分别填入whenA
or whenB
。
显然,有很多可能的方法来制作它,但问题是什么应该是最有效的?
解决方案
您可以使用递归 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 中的保留字。
这是一个 db<>fiddle。
我应该注意,如果您有某种数字或计数表,也可以使用它。
推荐阅读
- javascript - 将 team-js 导入 Vue.js 文件
- python - 如何以随机顺序使用多个列表但每次都匹配
- ubuntu-18.04 - 在 Ubuntu 18.04 上安装 python-poppler-qt4
- arm - 为什么 Eclipse CDT Indexer 不索引正确的配置?
- java - 从请求中获取 Keycloak auth-server-url?
- c++ - 当仅影响静态方法时,如何解决 C++ 中的链接器错误?
- gitlab - 时间:一些分支机构的手册
- r - 如何在 R 统计中结合两个函数?
- android - 在 Android Studio 中使用 Kotlin 构建一个简单的 MediaPlayer。无法获取要流式传输的 URL 数据源
- visual-studio - I'm getting a package Microsoft.Build 16.3.0 is not compatible with netstandard 2.0 error