【发布时间】:2013-07-13 12:23:03
【问题描述】:
我有一个可变长度的“学期”表,它们之间有可变中断,并且有一个约束,使得“开始日期”总是大于前一个“结束日期”:
id start_date end_date
-----------------------------
1 2012-10-01 2012-12-20
2 2013-01-05 2013-03-28
3 2013-04-05 2013-06-29
4 2013-07-10 2013-09-20
还有如下的学生表,其中开始日期可能出现在给定学期内的任何时间:
id start_date n_weeks
-------------------------
1 2012-11-15 25
2 2013-02-12 8
3 2013-03-02 12
我正在尝试通过加入“学期”中的“学生”来计算“结束日期”,其中考虑了学期之间的可变长度休息时间。
我可以画出上学期的结束日期(即从上一行的 end_date 开始),然后使用以下方法通过减法找到学期之间的天数:
SELECT start_date
, end_date
, lag(end_date) OVER () AS prev_end_date
, start_date - lag(end_date) OVER () AS days_break
FROM terms
ORDER BY start_date;
显然,如果只有两个术语,只需在天数中添加“休息”(也许,转换为“周”)——从而将“结束日期”延长同一时期的时间。
但是如果给定学生的“n_weeks”跨越多个学期,那么如何构建这样的查询?
在过去的几天里,我一直在用头撞墙,如果有人能提供任何帮助,我将非常感激......
非常感谢。
【问题讨论】:
-
这是一个 SQLFiddle,其中显示了用于测试可能解决方案的数据和查询:sqlfiddle.com/#!12/c487e/2
标签: sql postgresql date range