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

SQL statement dynamically using current time to choose a time frame in a field (Oracle)

所有,我有一个难倒我的东西,我已经看到了很多例子,但没有任何帮助解决这个问题。 我有像 03:30:00 到 11:29:59 这样的时间框架(比如轮班时间)。我想根据当前班次动态查询上一个班次的数据。 示例:如果当前在 11:30:00 AM 和 7:29:59 PM 之间,我想获得在 03:30:00 AM 和 11:30:00 AM 之间的最后一个班次。

在我看来,这看起来像是一个 if 语句: 如果时间介于....那么 select 之间的时间.... elseif 之间的时间......然后 select 之间的时间...

我尝试了很多组合,但无法解决这个问题。我想我需要一个 CASE,也许还需要一个子查询?或者也许 DECODE 会起作用?

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;

解释:

每班 8 小时,从 03:30(或午夜过后 210 分钟)开始;所以 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,对应于它是在一天中的第 1、2 还是第 3 个 8 小时时段。将该值乘以 480 分钟,然后加上日期最初偏移的 210 分钟,您就得到了班次开始当天开始后的分钟数。