我遇到一个问题,我有两个定义的互相排斥的时间段: 夜晚 18:00至06:00之间 DAY 06:00至18:00之间
然后我的记录间隔为 BEGIN 和 STOP 次,我基本上想要计算所述间隔的下降部分(即多少小时/分钟) DAY / NIGHT 期间。
*我的所有时间都是hhmm格式的整数,所以645表示6:45而1801表示18:01
所以......
BEGIN STOP NIGHT DAY
0 650 600 50
1951 235 644 0
930 1500 0 530
1700 2122 322 100
我真的不关心时间格式,我只需要理解用于以有效的方式解决这个问题的算法,不涉及几个嵌套的条件语句。
答案 0 :(得分:0)
您可以使用case
执行此操作。这是一个将句号分为三个的例子(你可以将第一个和第三个结合起来):
select (case when begin < 6
then least(6, end) - begin
else 0
end) as night_1,
(case when begin < 18 or end > 6
then least(18, end) - greatest(begin, 6)
end) as day,
(case when end > 18
then end - greatest(begin, 18)
else 0
end) as night_2
对于实际计算,您应该定义:
begin_hours = floor(begin / 100.0) + (begin % 100)/100.0
end_hours = floor(end / 100.0) + (end % 100)/100.0
然后在上一个查询中使用这些值。这会将值转换为十进制小时。