我有一个包含许多JOINS的报告,该报告的基础是一个名为“ table_class”的表(c)。我需要将该表(table_class)的“日期时间”字段与另一个称为“ table_period”的表进行比较。问题是表“ table_period”与“ table_class”没有关系。当“ table_class”的“开始日期”字段(日期时间)介于“ table_period”的开始日期和结束日期(两个日期时间)之间时,我需要显示“ table_period”的PK。
基本上,我想按班级发生/发生的时间段按班级显示时间段。
重要 :“ table_period”在用户级别具有灵活性,因为该期间没有固定的日期。
例如:
2016年第一学期:2016年1月1日至2016年6月30日
2016年第二学期:2016年7月1日至2016年12月31日
2017年第一学期:从2017年2月1日到2017年7月31日
2017年第二学期:从2017年8月1日到2018年1月31日
继续……所以,我无法确定期限。
我们该怎么做?是否可以在这种情况下创建JOIN甚至使用CASE表达式求解?
为清楚起见,我们可以在下面看到这些表的示例。
表1:table_class(c)(提醒该表是报表的基础)
CLASS_ID | START_DTE | END_DTE
0001 | Jun 29, 2017, 8:00 AM | Jun 29, 2017, 3:30 PM
0002 | Jan 11, 2018, 8:00 AM | Jan 12, 2018, 3:30 PM
...
表2:table_period(p)
PERIOD_ID | START_DTE | END_DTE
1st semester 2016 | Jan 1, 2016, 3:00 AM | Jun 30, 2016, 1:00 AM
2nd semester 2016 | Jul 1, 2016, 1:00 AM | Dec 31, 2016, 3:00 AM
1st semester 2017 | Feb 1, 2017, 3:00 AM | Jul 31, 2017, 1:00 AM
2nd semester 2017 | Aug 1, 2017, 1:00 AM | Jan 31, 2018, 3:00 AM
...
我期望的结果
c.CLASS_ID | p.PERIOD_ID | c.START_DTE | c.END_DTE
0001 | 1st semester 2017 | Jun 29, 2017, 8:00 AM | Jun 29, 2017, 3:30 PM
0002 | 2nd semester 2017 | Jan 11, 2018, 8:00 AM | Jan 12, 2018, 3:30 PM
...
谢谢!
答案 0 :(得分:0)
您可以像这样进行join
:
select c.*, p.period_id
from table_class c left join
table_period p
on c.start_dte < p.end_dte and c.start_dte >= p.start_dte;
这根据班级的开始时间分配时间(如果有的话)。