1. 描述
在Oracle数据库操作日期字段时,我用的是java风格的日期格式模板,即MM
表示月份,mm
表示分钟,hh
表示12小时,HH
表示24小时,结果与预期不一致。
Oracle数据库版本为11g,其他版本未验证。
下述只是我的个人总结,如有错误,欢迎补充。
2. 验证
select
SYSDATE,
TO_CHAR(SYSDATE,'yyyy-MM-dd HH:mm:ss') "HH:mm:ss",
TO_CHAR(SYSDATE,'yyyy-MM-dd HH:MM:ss') "HH:MM:ss",
TO_CHAR(SYSDATE,'yyyy-MM-dd hh:MM:ss') "hh:MM:ss",
TO_CHAR(SYSDATE,'yyyy-MM-dd hh:mm:ss') "hh:mm:ss",
TO_CHAR(SYSDATE,'yyyy-MM-dd hh:mi:ss') "hh:mi:ss",
TO_CHAR(SYSDATE,'yyyy-MM-dd hh12:mi:ss') "hh12:mi:ss",
TO_CHAR(SYSDATE,'yyyy-MM-dd hh24:mi:ss') "hh24:mi:ss"
from dual;
执行结果如下
3. 结论
oracle数据库的日期格式模板,不区分大小写
HH
与hh
相同,都表示12小时格式MM
与mm
相同,都表示月份- 24小时使用
hh24
或HH24
- 分钟使用
mi
或MI
java中的 yyyy-MM-dd_HH-mm-ss
,在Oracle中是yyyy-MM-dd_hh24-mi-ss
附字符串格式日期时间差计算
LPAD(TO_CHAR(
TRUNC(SYSDATE - TO_DATE(START_TIME, 'YYYY-MM-DD HH24:MI:SS')) * 24
+ FLOOR(MOD(SYSDATE - TO_DATE(START_TIME, 'YYYY-MM-DD HH24:MI:SS'), 1) * 24), 'FM09'), 2, '0') || ':' ||
LPAD(TO_CHAR(
FLOOR(MOD((SYSDATE - TO_DATE(START_TIME, 'YYYY-MM-DD HH24:MI:SS')) * 1440, 60)), 'FM09'), 2, '0') || ':' ||
LPAD(TO_CHAR(
FLOOR(MOD((SYSDATE - TO_DATE(START_TIME, 'YYYY-MM-DD HH24:MI:SS')) * 86400, 60)), 'FM09'), 2, '0')