postgresql重新组合连续一小时

时间:2018-03-01 09:46:28

标签: postgresql hour

我们的想法是将免费时间分组,以便为​​未来的客户提供预约

我有3张桌子

hour_dimension ,其中包括工作时间

select hour from hour_dimension

|hour   |
|-------|
|09:00  |
|09:30  |
|10:00  |
|10:30  |
|11:00  |
|11:30  |
|12:00  |
|14:00  |
|14:30  |
|15:00  |
|15:30  |
|16:00  |
|16:30  |
|17:00  |
|17:30  |
|18:00  |
|18:30  |
|19:00  |
|19:30  |
|20:00  |

事件,它构成了客户与约会之间的关系

|id |commentaire|client_id  |sms|state_id   |
---------------------------------------------
|463|           |308        |1  |1          |
|464|           |308        |1  |1          |
|465|           |308        |1  |1          |
包含客户约会的

rdv (仅适用于info event.id = rdv.id)

|id |date       |heure_debut|heure_fin  |
-----------------------------------------
|463|2018-02-15 |09:30      |11:00      |
|464|2018-02-15 |14:00      |16:00      |
|465|2018-02-15 |17:00      |18:00      |   

现在,我执行此查询以查找空闲时间:

select h.hour, heure_debut as begin_hour, heure_fin as end_hour
FROM hour_dimension h

left join 
( select * from rdv r 
left join event e ON (r.id = e.id)
where r.date = '2018-02-15' and e.state_id IN (1,2) )_A
ON (h.hour> heure_debut and h.hour < heure_fin)

结果pic.PNG我包围了空闲时间。

现在,我想将免费时间分组并得到以下结果:

|begin| end |duration|
|-----+-----+--------|
|09:00|09:30| 30mins |
|11:00|12:00| 60mins | 12:00 - 14:00 break time
|16:00|17:00| 60mins |
|18:00|20:00| 120mins|

1 个答案:

答案 0 :(得分:0)

我能够在飞行中找到的最佳“中级”解决方案是this小提琴。

我的猜测是你需要一个函数来最终产生你想要的结果。

如果你拿这个小提琴中间结果,把它/包含到函数中/中,消除所有与前一行结尾相同的行,将它们保存为temp_begin和temp_end并调用

EXTRACT(epoch FROM 
    to_timestamp(temp_end,  'HH24:MI') 
  - to_timestamp(temp_begin,'HH24:MI')
)/60 

关于那些临时变量,你应该能够得到你想要的东西