Oracle SQL Developer中to_date转换带时间日期字符串问题
Oracle
to_date 转换与DATE类型相关问题解答 Oracle DATE 类型的存储规则
Oracle数据库的DATE类型原生支持存储时间信息,精度精确到秒,内部存储包含世纪、年、月、日、时、分、秒共7个时间分量,并非只能存储日期内容。你观察到的时间部分丢失,几乎都是客户端工具的默认显示配置导致的,并非转换后的数据真的缺失时间值。
字符串May 1 2019 12:00的正确转换写法
英文月份缩写的字符串转换需要匹配对应的格式掩码,同时建议显式指定日期语言,避免会话NLS配置非英文时识别失败,正确SQL如下:
SELECT TO_DATE( 'May 1 2019 12:00', 'Mon DD YYYY HH24:MI', 'NLS_DATE_LANGUAGE = AMERICAN' ) AS target_date FROM dual;
参数说明:
- 格式掩码
Mon DD YYYY HH24:MI分别匹配:3位英文月份缩写、日期(自动识别1位/2位日期值)、4位年份、24小时制的小时与分钟 - 第三个参数强制指定日期解析语言为美式英语,避免不同会话环境下
May无法被识别为月份的问题
时间部分“丢失”的排查与修复
你在SQL Developer中看不到时间部分,是工具默认的日期显示格式仅配置了日期段,修改配置即可展示完整值:
- 打开顶部菜单栏「工具」→「首选项」
- 展开左侧菜单找到「数据库」→「NLS」配置页
- 将
日期格式项修改为YYYY-MM-DD HH24:MI:SS,保存设置后重新执行查询,即可看到转换结果里的完整时间信息
时间存储的替代方案
如果业务场景需要存储比秒更高精度的时间值,可以选择以下数据类型:
TIMESTAMP:支持最高纳秒级精度(默认保留6位小数秒),用法与DATE高度兼容,转换字符串时使用TO_TIMESTAMP函数即可TIMESTAMP WITH TIME ZONE:带时区偏移量的时间戳类型,适合跨时区的业务数据存储TIMESTAMP WITH LOCAL TIME ZONE:自动根据客户端会话时区转换显示时间的时间戳类型,适合全球统一部署的系统
内容的提问来源于stack exchange,提问作者nick shetty
相关产品推荐
相关产品推荐

