做数据分析时经常遇到甚至说大部分场景需要计算相关时间的间隔,对oracle数据库进行SQL查询时因为数据库字段结构经常会遇见数据格式不统一或其他问题造成的字段报错或者计算结果不是预期数据。
用我之前遇到过的例子做个演示,采用ceil语句进行时间间隔分钟查询计算:
SELECT CEIL (SYSDATE - MIN_CHANGED)*24*60,
SYSDATE,
MIN_CHANGED
FROM XXXXXXX
未进行*24*60计算输出结果:
进行*24*60计算输出结果:
可以看出因为日期字段不一致,输出了一个以天数单位的间隔日期,按照预期如果需要计算分秒精度,则需要对字段进行格式变换,标准写法方式如下:
SELECT CEIL (TO_DATE(SYSDATE,'YYYY-MM-DD HH24:MI:SS') -
TO_DATE(MIN_CHANGED,'YYYY-MM-DD HH24:MI:SS'))*24*60,
SYSDATE,
MIN_CHANGED
FROM XXXXXXX
运行结果报错:ORA-01861:文字与格式字符串不匹配,采用对字段进行字符串格式转换后
SELECT CEIL (TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') -
TO_DATE(TO_CHAR(MIN_CHANGED,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS'))*24*60,
SYSDATE,
MIN_CHANGED
FROM XXXXXXX
输出结果与之前一致,仍然是按照天为单位计算的结果,不再重新截图,更多时候这种转换方式会遇到报错:ORA-01830:日期格式图片在转换整个输入字符串之前结束。
综上:如过DATE格式字段下存储‘YYYY-MM-DD'和’YYYY/MM/DD‘或者直接按照时间日期格式填写数据,最后在调用数据时都会出现字段格式报错或计算结果达不到预期使用效果。
针对该问题出现场景,建议先对字段进行字符串转换,然后转换标准时间日期格式后进行间隔计算,之后将计算结果转换为数字格式(因为oracle默认时间按照天进行运算,转换为数字后保留精度对需要的小时、分钟、秒等进行计算),根据最终需要可选择使用round进行取整或其它方式使用计算结果。
SELECT ROUND(TO_NUMBER(TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS'),'YYYY/MM/DD HH24:MI:SS')-
TO_DATE(TO_CHAR(MIN_CHANGED,'YYYY/MM/DD HH24:MI:SS'),'YYYY/MM/DD HH24:MI:SS'))*24*60) 分钟计算,
SYSDATE,
MIN_CHANGED
FROM XXXXXXX
计算结果:
注:
---*24*60 分钟
---*24 小时
---直接ROUND 天
---如有其它应用,可直接保留数字计算结果即可。