我有一个保存为1900-01-01T00:00:00.000Z
字符串格式的日期。我正在尝试转换它,但是1900更改为2000。如何转换为时间戳而不丢失年份?
SELECT TO_TIMESTAMP(TO_CHAR(TO_DATE(SUBSTR('1900-01-01T13:00:00.000Z',0,10),'RRRR-MM-DD')),'DD/MM/RRRR HH24:MI:SSXFF')
FROM dual;
我有一个保存为1900-01-01T00:00:00.000Z
字符串格式的日期。我正在尝试转换它,但是1900更改为2000。如何转换为时间戳而不丢失年份?
SELECT TO_TIMESTAMP(TO_CHAR(TO_DATE(SUBSTR('1900-01-01T13:00:00.000Z',0,10),'RRRR-MM-DD')),'DD/MM/RRRR HH24:MI:SSXFF')
FROM dual;
你有两个问题。首先是其他受访者提到的所有不必要的额外转换。第二个,也是直接触及您发布问题的核心的一个,是在错误的世纪得到结果。这是您在 to_date/to_char/to_timestamp 函数中使用 RRRR 格式的结果。RRRR(和 RR)旨在为解决千年虫问题争取时间的临时选择。他们创建了一个滑动窗口,根据提供的年份假设世纪。事实证明,使用 RR / RRRR 格式只是在 20 年后重新创建 Y2k。停止使用这些格式,始终使用 YYYY 并始终处理 4 位数年份。我和我的数百万同事在 1998-1999 年花费了太多时间,只是为了看到这项工作白费了。
足以使用TO_TIMESTAMP
转换以及字母的双引号T
等Z
SELECT TO_TIMESTAMP('1900-01-01T13:00:00.000Z','YYYY-MM-DD"T"HH24:MI:SS.FF"Z"') AS ts
FROM dual
TS |
---|
01/01/1900 13:00:00,000000000 |
考虑到从图像中看到的小时部分为13 。显示样式因您当前与时间和日期相关的数据库的 NLS 设置而异
没有更多细节,一个选项(避免T
和Z
)
SQL> alter session set nls_timestamp_format='YYYY-MM-DDHH24:MI:SS.FF3' ;
Session altered.
SQL> select to_timestamp(replace(replace('1900-01-01T00:00:00.000Z','T',''),'Z',''),'RRRR-MM-DDHH24:MI:SS.FF3') from dual ;
TO_TIMESTAMP(REPLACE(REPLACE('1900-01-01T00:00:00.000Z','T',''),'Z',''),'RR
---------------------------------------------------------------------------
1900-01-0100:00:00.000
如果你想保留它们
SQL> select to_timestamp('1900-01-01T00:00:00.000Z','RRRR-MM-DD"T"HH24:MI:SS.FF3"Z"') from dual ;
TO_TIMESTAMP('1900-01-01T00:00:00.000Z','RRRR-MM-DD"T"HH24:MI:SS.FF3"Z"')
---------------------------------------------------------------------------
1900-01-0100:00:00.000