SQL语句动态使用当前时间选择字段(Oracle)中的时间范围



所有,我有一些让我困惑的东西,我已经看到了很多示例,但是没有什么可以解决这个问题了。我有时间框架,例如我与之合作的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分钟,您有了班次开始的几分钟。

最新更新