生产中遇到7:00 - 19:00白夜班 查日期的问题

本文介绍了一种使用SQL处理特定条件下日期的方法。通过一个具体的SQL查询案例,展示了如何根据`create_time`字段的小时部分来调整日期,特别是当小时小于7时进行前一天的日期转换,并截取所需的部分作为新的日期标识。此方法适用于需要按天聚合数据并进行特殊日期对齐的场景。

select  create_time,

left (case  when hour(create_time) < 7  then DATE_ADD(create_time,INTERVAL -1 DAY) else create_time end ,10) as day_ddddddddddddd 
        
from kjy_dsxtsfbzl 

order by create_time desc 


效果:

 

复杂SQL询逻辑结构 ├── 主询结构 │ ├── 左连接两个子结果集 │ │ ├── planres(计划数据) │ │ │ ├── 来源表:tt_wo_month_plan │ │ │ ├── 过滤条件 │ │ │ │ ├── PRODUCT_NAME='动力电池包总成' │ │ │ │ ├── DEL_FLAG='0' │ │ │ │ ├── DAILY_PLAN_QTY≠0 │ │ │ │ └── 动态日期判断 │ │ │ │ ├── 8点前取前一天 │ │ │ │ └── 8点后取当天 │ │ │ └── 输出字段 │ │ │ ├── 设备编号(line_name) │ │ │ ├── 产品相关ID/CODE │ │ │ └── 日计划量等 │ │ └── viewres(视图结果集) │ │ ├── UNION ALL结构 │ │ │ ├── 第一部分:original(实际生产数据) │ │ │ └── 第二部分:补充未完成数据 ├── 核心子询 │ ├── plant(计划累计计算) │ │ ├── 使用自连接计算累计计划量 │ │ │ ├── t1为基准数据 │ │ │ └── t2为历史累计 │ │ └── 动态日期范围 │ │ ├── 月初至当前/前一天 │ │ └── 产品ID过滤 │ ├── realt(实际生产统计) │ │ ├── 制造数据聚合 │ │ │ ├── 开始数量(beginqty) │ │ │ └── 结束数量(endqty) │ │ └── 产线过滤 │ │ ├── LINE_ID固定值 │ │ └── 制造类型ZP01 ├── 关键连接逻辑 │ ├── 班次时间判断 │ │ ├── 8-19点为白班 │ │ └── 其他时间为夜班 │ └── 区间匹配条件 │ ├── 白班匹配前半日计划 │ └── 夜班匹配后半日计划 ├── 特殊处理 │ ├── UNION ALL补充逻辑 │ │ ├── 使用用户变量@rank标记 │ │ └── 补充未覆盖计划量的空记录 │ └── 动态排序控制 │ ├── 原数据正序 │ └── 补充数据倒序 └── 最终输出 ├── 设备信息 ├── 计划与实际对比数据 └── 生产节奏(beat)信息 根据这个生成业务可以理解的思维导图
03-15
### 关于SQL代码中统计数量的清零时间分析 在给定的引用内容中,并未直接提到 `day_shift_count` 和 `night_shift_count` 的具体实现逻辑或相关SQL代码[^1]。然而,基于常见的SQL设计模式和业务需求,可以推测出统计数量的清零时间通常与以下条件有关: #### 1. **日期范围与时间周期** - 统计数量的清零操作通常依赖于时间周期,例如每日、每周或每月。如果涉及昼夜班统计(如 `day_shift_count` 和 `night_shift_count`),则可能基于工作班次的时间段来决定。 - 假设天班次为 `06:00:00` 至 `18:00:00`,夜间班次为 `18:00:00` 至次日 `06:00:00`,那么: - `day_shift_count` 可能在每天的 `06:00:00` 被清零。 - `night_shift_count` 可能在每天的 `18:00:00` 或次日的 `06:00:00` 被清零。 #### 2. **条件逻辑** - 清零操作可以通过触发器(Trigger)或调度任务(Job/Scheduler)实现。例如,在Oracle数据库中,可以使用 `DBMS_SCHEDULER` 创建一个定时任务,定期执行清零逻辑。 - 示例代码如下,展示如何通过调度任务清零统计数量: ```sql BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'RESET_SHIFT_COUNT', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN UPDATE shift_stats SET day_shift_count = 0, night_shift_count = 0 WHERE TRUNC(sysdate) = TRUNC(last_update_time); END;', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DAILY; BYHOUR=6; BYMINUTE=0; BYSECOND=0', -- 每天早上6点执行 enabled => TRUE ); END; ``` - 在上述代码中,`TRUNC(sysdate)` 确保只在新的一天开始时清零统计数量[^4]。 #### 3. **日期范围的影响** - 如果统计数量需要根据特定的日期范围进行清零,则需要明确该范围的起始和结束时间。例如,如果统计周期为每月一次,则可以在每月的第一天凌晨清零: ```sql BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'RESET_MONTHLY_COUNT', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN UPDATE shift_stats SET day_shift_count = 0, night_shift_count = 0 WHERE TO_CHAR(sysdate, ''YYYY-MM'') > TO_CHAR(last_update_time, ''YYYY-MM''); END;', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=MONTHLY; BYDAY=1; BYHOUR=0; BYMINUTE=0; BYSECOND=0', -- 每月第一天凌晨执行 enabled => TRUE ); END; ``` #### 4. **总结** - 具体的清零时间取决于业务逻辑和日期范围的设计。如果没有明确的日期范围定义,则默认可能基于系统时间或触发条件(如每天的固定时间点)。 - 如果存在更复杂的条件逻辑(如跨班次统计或节假日调整),则需要进一步分析具体的SQL代码和业务规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

somdip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值