0

转换为时间戳

我有一个保存为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;
4

3 回答 3

2

你有两个问题。首先是其他受访者提到的所有不必要的额外转换。第二个,也是直接触及您发布问题的核心的一个,是在错误的世纪得到结果。这是您在 to_date/to_char/to_timestamp 函数中使用 RRRR 格式的结果。RRRR(和 RR)旨在为解决千年虫问题争取时间的临时选择。他们创建了一个滑动窗口,根据提供的年份假设世纪。事实证明,使用 RR / RRRR 格式只是在 20 年后重新创建 Y2k。停止使用这些格式,始终使用 YYYY 并始终处理 4 位数年份。我和我的数百万同事在 1998-1999 年花费了太多时间,只是为了看到这项工作白费了。

于 2021-09-30T13:20:12.720 回答
1

足以使用TO_TIMESTAMP转换以及字母的双引号TZ

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 设置而异

于 2021-09-30T13:00:10.080 回答
1

没有更多细节,一个选项(避免TZ

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
于 2021-09-30T13:00:14.323 回答