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
相关产品推荐
相关产品推荐

