我希望为一组提供各种服务的用户建模,这些服务需要花费不同的时间,并希望建立Postgresql支持的相对较新的范围日期类型,以使事情更加清晰。
Bookings:
user_id|integer
time|tsrange
service_id|integer
Services:
user_id|integer
time_required|integer #in hours
Users:
id|integer
服务因用户而异,有些可能相同,但需要一个用户2小时,另一个用户只需1小时。
搜索在给定时间段内或之内发生的预订很容易。我无法弄清楚如何最好地让所有在某一天有时间可用的用户来执行他们的一项或多项服务。
我认为我需要找到他们预订范围的倒数,在给定的一天上午6点/ 8点绑定,然后查看该集合中的最大范围是否适合他们的最小服务,但要弄清楚SQL中的表达方式是多少躲避我。
是否可以进行范围反转,或者它们是更好的方法来解决这个问题?
答案 0 :(得分:1)
问题并不完全清楚,但如果我做对了,你就会寻找lead()或lag()窗口函数来计算可用的时间段。如果是这样,这应该让你走上正轨:
select bookings.*, lead("time") over (order by "time") as next_booking_time
from bookings
http://www.postgresql.org/docs/current/static/tutorial-window.html