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

SQL语句使用当前时间动态选择字段中的时间范围(Oracle),sql,oracle,case,between,Sql,Oracle,Case,Between,总之,我有一些东西让我感到困惑,我看到了很多例子,但没有什么能帮助解决这个问题。 我有像03:30:00到11:29:59这样的时间框架,我使用的是轮班时间。我想根据当前班次动态查询上一班次的数据。 示例:如果当前是上午11:30:00到下午7:29:59之间,我希望得到最后一班是上午03:30:00到上午11:30:00之间的班次 在我看来,这就像是一个if语句: 如果时间介于。。。。然后 选择…之间的时间。。。。 如果时间在。。。。然后 选择时间间隔 我尝试了很多组合,但都没办法解决这个问题

总之,我有一些东西让我感到困惑,我看到了很多例子,但没有什么能帮助解决这个问题。 我有像03:30:00到11:29:59这样的时间框架,我使用的是轮班时间。我想根据当前班次动态查询上一班次的数据。 示例:如果当前是上午11:30:00到下午7:29:59之间,我希望得到最后一班是上午03:30:00到上午11:30:00之间的班次

在我看来,这就像是一个if语句: 如果时间介于。。。。然后 选择…之间的时间。。。。 如果时间在。。。。然后 选择时间间隔

我尝试了很多组合,但都没办法解决这个问题。我想我需要一个案例,也许还有一个子查询?或者解码会起作用

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')))
)
说明:

每班8小时,从午夜3:30或210分钟开始;因此,SYSDATE-INTERVAL'210'MINUTE将偏移时间,以便在该偏移之后,时间从00:00、08:00和16:00开始,这是一天的三分之一


date_值-TRUNC date_值计算时间分量表示的0到1之间的一天的分数;因此,TRUNC date_value-TRUNC date_value*3将一天中的分数映射为0、1或2,对应于它是在一天中的第一、第二或第三个8小时内。将该值乘以480分钟,然后再加上日期最初偏移的210分钟,即班次开始当天的分钟数。

Oracle没有时间数据类型。数据库中的示例数据将非常有用。你也有约会,还是只有时间?是否存在重叠班次的可能性03:30:00-11:30:00与07:00:00-15:00:00?您是否有表格中数据的样本?它是一种时间戳类型,包含日期:2017-04-19 06:19:46不存在重叠班次的可能性。他们是3:30:00-11:29:59,11:30:00-19:29:59和19:29:59-3:29:59第二天你能提供一些关于上述陈述的信息吗?这很有效!我很想得到一点关于它的解释,但万一我需要做更多的工作。谢谢你的帮助MTO@补充了LKM的解释。
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;