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数据库的日期格式模板,不区分大小写

  • HHhh相同,都表示12小时格式
  • MMmm相同,都表示月份
  • 24小时使用hh24HH24
  • 分钟使用miMI

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') 
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐