|
SQL:
SELECT COUNT(CASE WHEN last_s<last_m AND DECODE(s,0,360,s)>=DECODE(m,0,360,m) THEN 1 END)
+COUNT(CASE WHEN last_s<last_h AND DECODE(s,0,360,s)>=DECODE(h,0,360,h) THEN 1 END)
+COUNT(CASE WHEN last_m<last_h AND DECODE(m,0,360,m)>=DECODE(h,0,360,h) THEN 1 END) cnt
FROM (
SELECT h,m,s
,LAG(h) OVER(ORDER BY n) last_h
,LAG(m) OVER(ORDER BY n) last_m
,LAG(s) OVER(ORDER BY n) last_s
FROM (SELECT MOD(360*10.5/12+(LEVEL-1)*360/(12*60*60),360) AS h
,MOD(360*0.5+(LEVEL-1)*360/(60*60),360) AS m
,MOD((LEVEL-1)*360/60,360) s
,LEVEL n
FROM DUAL
CONNECT BY LEVEL<=12*60*60+1
)
)
CNT
----------
1438
原理是:每秒观察一次,如果上一秒某个针在另一针之后,这一秒变成领先,就认为重叠了一次。
这里面有三针重合的要扣去, 还剩1437, 另外还有哪次是多出来的? |
|