H2数据库Oracle模式下Windows系统TO_TIMESTAMP函数失效排查
问题原因与解决方案
问题原因
- H2数据库在Oracle兼容模式下,解析
TO_TIMESTAMP的MON格式时,会读取当前系统的区域设置获取月份缩写规则:Windows英文区域默认9月缩写是Sept,而Ubuntu等Linux系统默认是Sep,这导致跨系统解析不一致 - 时隔一年出现问题,核心是H2版本更新:旧版H2对月份缩写匹配更宽松,新版严格遵循系统区域规则,原本兼容的
SEP在Windows下无法匹配系统默认的Sept - Oracle原生
TO_TIMESTAMP对月份缩写的大小写、长度不敏感,但H2的Oracle兼容模式未完全实现该特性,才出现这种跨系统冲突
解决方案
方案1:统一H2的区域设置
修改JDBC连接URL,强制指定H2使用固定区域,消除系统差异,推荐用en_US(9月缩写为Sep,和Linux默认一致):
jdbc:h2:mem:dev;MODE=Oracle;LOCALE=en_US
原脚本的SEP格式可以在Windows和Ubuntu下正常解析
方案2:替换为数字月份
彻底规避区域依赖,把脚本中的月份缩写改成数字,同时调整格式串:
将原SQL语句:
TO_TIMESTAMP('27-SEP-21 10.00.00.000000000 PM', 'DD-MON-RR HH.MI.SSXFF AM')
改为:
TO_TIMESTAMP('27-09-21 10.00.00.000000000 PM', 'DD-MM-RR HH.MI.SSXFF AM')
方案3:修改Windows本地区域设置(仅本地开发用)
如果只适配个人Windows环境,可以修改系统的月份缩写:
- 打开「控制面板」→「区域」→「其他设置」→「日期」
- 找到9月的缩写栏,改为
Sep - 此方案不适合团队协作,仅作临时本地修复
内容的提问来源于stack exchange,提问作者Efka
相关产品推荐
相关产品推荐

