首先,为粗略的标题道歉。真的不确定如何简单地总结一下。我对SQL也很陌生,但是找不到任何可以帮助的东西...
数据有四个相关的列。 RotationID,DutyPeriod,ReportTime,ReleaseTime。
RotationID | DutyPeriod | ReportTime | ReleaseTime
--------------------------------------------------
12 | 1 | 17Jul-0345 | 17Jul-1130
12 | 2 | 18Jul-1000 | 18Jul-1800
12 | 3 | 19Jul-0730 | 19Jul-1245
23 | 1 | 17Jul-0315 | 17Jul-1030
34 | 1 | 16Jul-0700 | 16Jul-0930
34 | 2 | 17Jul-0615 | 17Jul-1140
34 | 3 | 18Jul-1115 | 18Jul-1910
RotationID最多可以有5个DutyPeriod,每个DutyPeriod都保存在不同的行中。我想运行一个查询,该查询返回所有不同的RotationID,它们在前两个小时内发布了一个工作期,并在将来报告了16到26个小时。
我只是非常难以接受查询以返回符合这两个标准的ID,而不仅仅是其中之一。此外,sysdate列的格式正确,以便与sysdate一起使用,我只是不想输出示例数据的完整格式。
我玩过自我联盟,父母专栏(从未使用它们,似乎很混乱),甚至玩弄了一个案例滞后陈述的想法,但是还没有能够找出有效的方法。
我附上了示例表here的屏幕截图。绿色突出显示的行是符合两个条件的行,黄色突出显示的行是仅满足两个条件之一且不应返回的行。如果这也很重要,那么它将保存在Oracle数据库中。
所以,给出最简单的查询概念:
SELECT DISTINCT erd.RotationID FROM css.empl_rotation_duty erd
WHERE erd.ReportTime BETWEEN sysdate - (2/24) AND sysdate
AND erd.ReleaseTime BETWEEN sysdate + (16/24) AND sysdate + (26/24)
预期查询的输出应该是,假设查询是在7月17日的1200
运行的RotationID |
------------
12
34
78
90
答案 0 :(得分:2)
这听起来像你想要的:
//for hold and wait, just don't allocate the resource if a thread asks for it. Just wait and execute the other one
//t1-> request W. requires W
//t2-> has W
//t1 checks if W is free. wait
//t2 executes. Releases W
//t1 executes
//basically, if all locks are free, execute, else not.