SQL Count 不同的时间,相差 30 分钟

标签 sql datetime time count distinct

我正在尝试找到一个 SQL 查询,该查询将计算至少相差 30 分钟的不同开始时间的数量。

我有一些员工在一周内至少三个不同的时间开始工作时获得积分,其中开始时间与其他开始时间至少相差 30 分钟。
例如:

select count(distinct (CONVERT(VARCHAR(10), starttime, 108))), employeecode
from schedule 
where CONVERT(VARCHAR(10), starttime, 108) >= 
(select min(CONVERT(VARCHAR(10), dateadd (mi, 30, s2.starttime), 108)) from schedule s2)  
group by starttime, employeecode

我希望通过员工代码以及不同和不同的开始时间的数量获得结果。例如。 Employeecode = 9999,不同的开始时间 = 4
我一直在笨手笨脚地完成这个,但还没有得到一些工作......

谁能建议我哪里出错或可能对我有帮助的合适解决方案?
在此先感谢您的帮助 :)

最佳答案

在等待澄清确切要求时,我想我会建议另一种方法。我会说它的优点和缺点...

如果开始时间通常在某个时间或某个时间附近(您的示例总是在半小时或整点),那么您可以将所有开始时间分成它们所在的“波段”,然后计算数量不同的乐队。

例如 00:00-00:30 = 波段 1
00:30-01:00 = 波段 2
...
07:00-07:30 = 乐队 15
...
23:30-00:00 = 48 乐队

要获得乐队,您只需要一个简单(虽然很长)的案例陈述。

这种方法的主要问题是当你的时间接近阈值时它会下降。例如 07:29 和 07:31 将在两个不同的频段,但实际上仅相隔 2 分钟。如果您大约在同一时间开始,可以通过让乐队在每小时 15 分钟和 45 分钟开始和结束来稍微缓解这种情况。然后,如果开始时间都在乐队的中间,那么你会得到它大部分是正确的......

在我的脑海里,虽然这个问题并不是真正适合 SQL 的问题,所以如果你能用另一种语言来做可能会更好......

您可能可以通过一些棘手的连接在 SQL 中执行此操作,但我无法为它编写可靠的 SQL...尽管您想要执行以下操作,但从算法上讲。

1)取一天中最早的开始时间,并将其称为您的第一个开始时间。
2) 取下一个最早的时间,比上一步的时间晚至少 30 分钟。
3) 重复第 2 步,直到时间用完。
4) 计算次数。

从 SQL 的角度来看,这样做的问题在于它试图根据前一行创建数据,这意味着使用游标来循环遍历时间并将内容存储在变量中。

关于SQL Count 不同的时间,相差 30 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3132782/

相关文章:

具有多个 ID 的 SQL Select

javascript - 将 jwt.iat(发布于)属性与当前日期时间进行比较时遇到问题 - ("Seconds Since the Epoch"NumericDate)

Symfony 4,传递给 .. 的参数 1 必须是 DateTime 的实例,给定为 null

php - 如何获取当前分钟php

c - 在用户空间程序中请求定时器中断?

php - 如何从两次计算两个小时?

mysql - 对 3 个表进行 SQL 查询(计数)

python - 旋转 SQLite 表,像 SQL 一样应该是

JavaScript 日期时区问题?

sql - 将 DELETE FROM 与 OUTPUT 结合使用时如何指定 ORDER BY?