所有,我有一些让我困惑的东西,我已经看到了很多示例,但是没有什么可以解决这个问题了。我有时间框架,例如我与之合作的03:30:00至11:29:59(例如Shift Times(。我想根据当前偏移动态查询最后一班。示例:如果目前是在11:30:00 am到7:29:59 PM之间
这看起来像是我脑海中的if词: 如果之间的时间....然后 选择...之间的时间 彼此之间的elseif时间。 选择...
之间的时间我尝试了许多组合,无法弄清楚。我想我需要一个案例,也许是一个子查询?也许解码会起作用?
SELECT CAST(ccd.DATEc AS TIME) as time_occured,
FROM db.datatb ccd
WHERE ccd.DATE > SYSDATE - interval '1440' minute
AND (
((TO_CHAR(SYSDATE, 'hh24:mi:ss')BETWEEN '03:30:00' AND '11:29:59' IN (SELECT
ccd.DATEc FROM db.datatb WHERE (CAST(ccd.DATEc AS TIME)NOT BETWEEN '03:30:00
AM' AND '07:29:59 PM')))
OR (TO_CHAR(SYSDATE, 'hh24:mi:ss')BETWEEN '11:30:00' AND '19:29:59' IN
(SELECT ccd.DATEc FROM db.datatb WHERE (CAST(ccd.DATEc AS TIME) BETWEEN
'03:30:00 AM' AND '11:29:59 AM')))
OR (TO_CHAR(SYSDATE, 'hh24:mi:ss')NOT BETWEEN '03:30:00' AND '19:29:59' IN
(SELECT ccd.DATEc FROM db.datatb WHERE (CAST(ccd.DATEc AS TIME) BETWEEN
'11:30:00 AM' AND '07:29:59 PM')))
)
SELECT *
FROM db.datatb
CROSS JOIN
( SELECT TRUNC( SYSDATE - INTERVAL '210' MINUTE )
+ NUMTODSINTERVAL(
TRUNC(
( SYSDATE - INTERVAL '210' MINUTE
- TRUNC( SYSDATE - INTERVAL '210' MINUTE )
) * 3
) * 480
+ 210,
'MINUTE'
) AS current_shift_start
FROM DUAL
) css
WHERE DATEc >= css.current_shift_start - INTERVAL '8' HOUR
AND DATEc < css.current_shift_start;
说明:
从03:30开始(或午夜210分钟(,每个班次为8小时;因此,SYSDATE - INTERVAL '210' MINUTE
将移动偏移时间,以便在此偏移之后,它们从00:00、08:00和16:00开始,这是一天的三分之一。
date_value - TRUNC( date_value )
计算时间组件代表的一天的分数(0到1之间(;因此,TRUNC( ( date_value - TRUNC( date_value ) ) * 3 )
将一天中的一小部分映射到0、1或2,与在一天的第一,第二或第3小时时相对应。多次该值乘以480分钟,然后添加日期最初被抵消的210分钟,您有了班次开始的几分钟。