gpt4 book ai didi

mysql - 在 mysql 中查找最近的空闲时间段的查询 - 为什么它不起作用?

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:45 26 4
gpt4 key购买 nike

我有一个名为 notes 的表,其中有三个字段:

id  |      start_time       |  duration
1 | 2015-10-21 19:41:35 | 15
2 | 2015-10-21 19:41:50 | 15
3 | 2015-10-21 19:42:05 | 15
4 | 2015-10-21 19:42:35 | 15
etc.

id是INT字段

start_time 是一个 TIMESTAMP 字段

duration 是一个 INT 字段,表示每个事件持续的秒数。

我正在编写一个 SQL 查询,它将获取 3 个字段作为输入:durationbegin_timeend_time 并将返回给我一个 timestamp 字段,其中 exactly new even 可以适合。

基于 StackOverflow 上许多与我类似的问题(主要是这个问题 MySQL / PHP - Find available time slots),我创建了一个查询:

SELECT (a.start_time + a.duration) AS free_after FROM notes a
WHERE NOT EXISTS ( SELECT 1 FROM notes b
WHERE b.start_time BETWEEN (a.start_time+a.duration) AND
(a.start_time+a.duration) + INTERVAL '$duration' SECOND) AND
(a.start_time+a.duration) BETWEEN '$begin_time' AND '$end_time'

但是当我按如下方式运行时:

SELECT (a.start_time + a.duration) AS free_after FROM notes a
WHERE NOT EXISTS ( SELECT 1 FROM notes b WHERE b.start_time
BETWEEN (a.start_time+a.duration) AND (a.start_time+a.duration) + INTERVAL 15 SECOND )
AND (a.start_time+a.duration) BETWEEN '2015-11-21 19:41:30' AND '2015-11-21 19:43:50'

我没有找到任何记录,尽管 - 查看上面提到的表格 - 我应该得到一个结果:

     free_after 
2015-11-21 19:42:20

(因为在这两条记录之间:

 3  |  2015-10-21 19:42:05  |    15
4 | 2015-10-21 19:42:35 | 15

有 15 秒的空闲时段)。那么,为什么我的查询无法正常工作?

==== 编辑:

在听从 Richard 的建议后,我执行了一个show warnings 查询,它返回了我的值:

Truncated incorrect DOUBLE value: '2015-11-21 19:4...
Truncated incorrect DOUBLE value: '2015-11-21 19:4...
Truncated incorrect DOUBLE value: '2015-11-21 19:4...
Truncated incorrect DOUBLE value: '2015-11-21 19:4...
Incorrect datetime value: '0'

我不确定是什么原因造成的,你能帮我解决这个问题吗?

===== 编辑 2

好的,在听从另一个@Richard 的建议(顺便说一句,谢谢!)后,我将查询更改为以下:

SELECT (a.start_time + INTERVAL a.duration SECOND) AS free_after FROM notes a
WHERE
NOT EXISTS ( SELECT 1 FROM notes b WHERE b.start_time
BETWEEN (a.start_time + INTERVAL a.duration SECOND) AND
(a.start_time + INTERVAL a.duration SECOND) + INTERVAL 15 SECOND ) AND
(a.start_time + INTERVAL a.duration SECOND) BETWEEN '2015-11-21 19:41:30' AND '2015-11-21 19:43:50'

这次我得到了一个结果(这是一个好消息):

2015-10-21 19:42:50

但这是一个错误的值(这是一个更糟糕的信息)。应该是 2015-10-21 19:42:20... 还有什么我在这里做错了吗?当我在它之后立即执行 show warnings 时 - 这里没有更多内容:(

最佳答案

BETWEEN 子句与结束日期完全匹配。对于您的示例数据,一旦您添加了 15 秒的持续时间和固定的持续时间(也是 15 秒),它就会与您的最后一个 30 秒的示例数据相匹配,因此排除了。将您的查询修改为

SELECT (a.start_time + INTERVAL a.duration SECOND) AS free_after FROM notes a
WHERE
NOT EXISTS ( SELECT 1 FROM notes b WHERE b.start_time
BETWEEN (a.start_time + INTERVAL a.duration SECOND) AND
(a.start_time + INTERVAL a.duration SECOND) + INTERVAL 15 SECOND - INTERVAL 1 MICROSECOND) AND
(a.start_time + INTERVAL a.duration SECOND) BETWEEN '2015-10-21 19:41:30' AND '2015-10-21 19:43:50'

(即减去1微秒作为调整)

你会得到答案:

+---------------------+
| free_after |
+---------------------+
| 2015-10-21 19:42:20 |
| 2015-10-21 19:42:50 |
+---------------------+
2 rows in set (0.00 sec)

关于mysql - 在 mysql 中查找最近的空闲时间段的查询 - 为什么它不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33688658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com