问题场景:
线上环境数据库中某些基础数据导入进测试库中,测试功能失效,经过排查发现,测试库导入的数据均以过期,数据无效。
数据库为Oracle11g
客户端工具PLSQL
数据过去字段类型为TIMESTAMP类型,线上数据插入时间为“2099-01-01 00:00:00”
插入后数据库中数据显示为“01-JAN-9912.00.00.000000 AM”
to_char此字段显示也为2099年
至此处为任何问题
将数据刷入测试库中,数据库中显示“01-JAN-9912.00.00.000000 AM”
to_char数据变为1999年01月01日
在此处发生问题
通过网上搜索未发现怎么解决,加了个oracle的qq交流群被一大哥点醒。应该是timestamp类型显示相关问题
最后解决
为本地客户端配置环境变量:
变量名:MLS_TIMESTAMP_FORMAT
变量值:YYYY-MM-DD HH24:MI:SS
PLSQL显示timestamp时对其格式读取从注册表读取,默认格式是啥俺也不清楚,估计就是“01-JAN-9912.00.00.000000 AM”这么个类型滴
配上环境变量后再显示时间戳时时根据自己配置格式显示,此时PLSQL中显示为符合本地环境变量时间戳格式的显示:2099-01-01 00:00:00
此时再将数据导出、导入将不会出现问题。
个人认为:
01-JAN-9912.00.00.000000 AM 此格式显示将年份仅显示后两位,故2099-01-01 00:00:00和1999-01-01 00:00:00两个日期格式化后显示相同,实际真实数值不同,仅显示相同
但是当导入时,对于时间戳01-JAN-9912.00.00.000000 AM 系统认为是一个具体指,而非显示的值, 系统默认值01-JAN-9912.00.00.000000 AM的具体值应为1999-01-01 00:00:00
纯属个人理解,未曾深入研究,如有不对之处,还请指出,谢谢