mysql - 查找给定期间的所有条目,而条目可以在一天之前或之后开始,但对于正在进行的条目,entry-end 可能为空
问题描述
我有一张表,里面有很多我想查询的条目。我想显示与某个时间跨度重叠的条目。
通常我会用
entry.start <= timespan.end AND entry.end >= timespan.start
所以我会找到并显示所有边缘情况:
|------- time span to query -----|
|--------------|
|----------|
|-------------------------------------------------|
|-----------|
not a result:
x------X
但是数据模型还指定条目的结束时间可能是null
:条目正在进行中......
所以:
|------- time span to query -----|
|--------------------------------------------------------
|--------------------------------------------
The follwing should not be in the result:
x----------
我正在努力如何编写正确的查询来解决端点的空值...
解决方案
这是常见的范围重叠。一般规则 - 期间开始少于相反的期间结束。如果某个边框可能为空,这意味着“无限”,则此类边框将替换为其相反的边框(如果两个开始或两端都不能为空)或整个表格MIN(start)
或MAX(end)
整个表格。
在您的情况下(检查的时间跨度范围始终设置两个边界)条件可能是
WHERE COALESCE(entry.start, timespan.start) <= timespan.end
AND COALESCE(entry.end, timespan.end) >= timespan.start
如果不得返回相邻(但不重叠)的范围,则分别替换<=
and >=
with <
and >
。
推荐阅读
- node.js - 慢模式命令总是发送相同的东西
- flutter - Play 控制台崩溃 - 中止/信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR)
- javascript - 为什么从“findLocation()”返回值未定义的承诺?
- jquery - 数据表按属性标题过滤,
- android - 使用视图模型时不断收到“分类器‘SharedViewModel’没有伴随对象,因此必须在此处初始化”错误
- swift - 如果第二个小数位为 0,则会被截断
- python - 功能测试没有按预期进行(AoC 第 4 天的一部分)
- c++ - 为什么有时只需要包含标题?
- javascript - 如何从 React 函数访问输入元素
- ubuntu - 这是在 Ubuntu 20.04 上分发 Ansible 的正确方法吗?