to_date() 时间相减 截取

本文介绍了如何使用to_date()函数进行时间相减以计算两个日期之间的差距,并展示了如何利用TRUNC函数来获取特定日期的截断值,此外还提供了一个统计不同状态记录下时间总和的示例。

to_date() 时间相减

select to_date(untreat_date,'yyyy-mm-dd hh24:mi:ss')-to_date(reg_date,'yyyy-mm-dd hh24:mi:ss')
  from XXX where to_date(untreat_date,'yyyy-mm-dd hh24:mi:ss')-to_date(reg_date,'yyyy-mm-dd hh24:mi:ss')>0

 

TRUNC(date[,fmt]) 截取

      date 一个日期值 
  fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去

      trunc(sysdate,'yyyy') --返回当年第一天. 
  trunc(sysdate,'mm') --返回当月第一天.
  trunc(sysdate,'d') --返回当前星期的第一天.
  trunc(sysdate,'dd')--返回当前年月日

 

select status,count(*) countnum,CAST(sum(time) as decimal(38, 0))
sumtime from XXX where indate>trunc(sysdate-2)
AND indate<trunc(sysdate) group by status

你写的这个 SQL 表达式: ```sql Round((To_Date('20251209 073000','YYYYMMDD HH24MISS') - To_Date(SubStr(stagetitime,1,15),'YYYYMMDD HH24MISS')),2) Instagetime ``` 目的是计算两个时间之间的差值,并保留两位小数,**期望得到“分钟数”**。但你说“减出来不对”,原因在于: > ❌ **Oracle 中两个 `DATE` 类型相减的结果是“天数(days)”,不是分钟!** --- ### ✅ 问题解析 #### 🔹 示例: ```sql To_Date('20251209 073000', 'YYYYMMDD HH24MISS') - To_Date('20251209 070000', 'YYYYMMDD HH24MISS') = 0.020833... 天 ``` 这其实是 **30 分钟 = 30/(24×60) = 30/1440 ≈ 0.020833 天** 👉 所以你直接 `ROUND(..., 2)` 得到的是 **以“天”为单位的差值**,四舍五入到小数点后两位,比如 `0.02` 天,而不是你想的 `30` 分钟。 --- ### ✅ 正确做法:将“天数”转换成“分钟数” 你需要把结果乘以 **24(小时/天) × 60(分钟/小时) = 1440** #### ✅ 正确 SQL 写法(得到分钟数): ```sql SELECT ROUND( (To_Date('20251209 073000', 'YYYYMMDD HH24MISS') - To_Date(SubStr(stagetitime, 1, 15), 'YYYYMMDD HH24MISS')) * 1440, -- 转换为分钟 2 ) AS Instagetime FROM your_table; ``` 📌 解释: - `(date1 - date2)` → 返回相差多少“天” - `* 1440` → 把“天”转成“分钟”(因为 1 天 = 1440 分钟) - `ROUND(..., 2)` → 四舍五入到小数点后两位(例如:30.00 或 15.50 分钟) --- ### ✅ 额外建议:确保 `stagetitime` 格式正确 你用了: ```sql SubStr(stagetitime,1,15) ``` 假设 `stagetitime` 是类似 `'20251209 070000xxx'` 的字符串(前15位是标准时间),那没问题。 但如果 `stagetitime` 字段长度不足或格式不一致(如中间有分隔符、空格等),会导致 `TO_DATE` 报错。 ✅ 建议加个检查: ```sql -- 先确认 substr 后是合法时间格式 SELECT SubStr(stagetitime, 1, 15) FROM your_table WHERE ROWNUM=1; ``` 应返回类似:`20251209 070000` --- ### ✅ 完整示例验证 ```sql SELECT To_Date('20251209 073000', 'YYYYMMDD HH24MISS') AS end_time, To_Date('20251209 070000', 'YYYYMMDD HH24MISS') AS start_time, (To_Date('20251209 073000', 'YYYYMMDD HH24MISS') - To_Date('20251209 070000', 'YYYYMMDD HH24MISS')) AS diff_days, ROUND( (To_Date('20251209 073000', 'YYYYMMDD HH24MISS') - To_Date('20251209 070000', 'YYYYMMDD HH24MISS')) * 1440, 2) AS diff_minutes FROM dual; ``` 输出: | DIFF_DAYS | DIFF_MINUTES | |----------|--------------| | 0.020833 | 30.00 | ✅ 成功得到 30 分钟! --- ### ✅ 总结:你的错误在哪? | 错误点 | 说明 | 修正方法 | |--------|------|-----------| | ❌ 直接用日期相减当分钟 | Oracle 中差值单位是“天” | 必须 ×1440 转成分钟 | | ❌ ROUND 没考虑单位 | 0.02 天 ≠ 2 分钟(其实是 28.8 分钟) | 先转换单位再四舍五入 | | ⚠️ SubStr 截取风险 | 如果字段格式不稳定会出错 | 建议先清洗数据或使用正则验证 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值