You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL班次分类咨询:无需函数/存储过程区分两班次记录

Oracle SQL 识别班次记录解决方案

以下是仅通过SQL语句实现班次划分的方案,无需创建函数或存储过程:

核心逻辑

  • Shift 1:当日7:00:00 至 18:59:59
  • Shift 2:当日19:00:00 至 次日6:59:59(凌晨时段的记录归属前一天的Shift 2)

实现SQL

假设你的业务表名为shift_records,包含record_id(记录ID)和event_time(事件时间,类型为TIMESTAMP或DATE)字段:

SELECT
    record_id,
    event_time,
    -- 识别班次
    CASE
        WHEN TO_CHAR(event_time, 'HH24MI') BETWEEN '0700' AND '1859' THEN 'Shift 1'
        WHEN TO_CHAR(event_time, 'HH24MI') >= '1900' OR TO_CHAR(event_time, 'HH24MI') <= '0659' THEN 'Shift 2'
    END AS shift,
    -- 可选:返回班次对应的统计日期(凌晨记录归属前一天)
    CASE
        WHEN TO_CHAR(event_time, 'HH24MI') <= '0659' THEN TRUNC(event_time) - INTERVAL '1' DAY
        ELSE TRUNC(event_time)
    END AS shift_date
FROM shift_records;

样本数据

你可以用以下语句创建测试表并插入样本数据验证逻辑:

-- 创建测试表
CREATE TABLE shift_records (
    record_id NUMBER,
    event_time TIMESTAMP
);

-- 插入测试数据
INSERT INTO shift_records VALUES (1, TIMESTAMP '2024-05-20 06:30:00'); -- Shift 2(归属2024-05-19)
INSERT INTO shift_records VALUES (2, TIMESTAMP '2024-05-20 07:00:00'); -- Shift 1
INSERT INTO shift_records VALUES (3, TIMESTAMP '2024-05-20 12:45:00'); -- Shift 1
INSERT INTO shift_records VALUES (4, TIMESTAMP '2024-05-20 18:59:59'); -- Shift 1
INSERT INTO shift_records VALUES (5, TIMESTAMP '2024-05-20 19:00:00'); -- Shift 2
INSERT INTO shift_records VALUES (6, TIMESTAMP '2024-05-20 23:59:59'); -- Shift 2
INSERT INTO shift_records VALUES (7, TIMESTAMP '2024-05-21 00:00:00'); -- Shift 2(归属2024-05-20)

说明

  • 使用TO_CHAR(event_time, 'HH24MI')将时间转换为四位字符串,通过字符串范围比较实现简单直观的班次判断,避免复杂的日期运算。
  • shift_date字段用于将凌晨时段的Shift 2记录关联到前一天,方便按班次日期进行分组统计或报表生成。

内容的提问来源于stack exchange,提问作者Bryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:12:39