Oracle 字符串到日期到时间戳
Posted
技术标签:
【中文标题】Oracle 字符串到日期到时间戳【英文标题】:Oracle String to Date to Timestamp 【发布时间】:2021-09-30 12:48:03 【问题描述】:我有一个日期保存为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;
【问题讨论】:
显示使用您的代码尝试。 (我看不懂那个小图片文字。) 请不要将代码发布为图片。请参阅此处了解更多详细信息原因:meta.***.com/questions/285551 【参考方案1】:你有两个问题。首先是其他受访者提到的所有不必要的额外转换。第二个,也是直接触及您发布问题的核心的一个,是在错误的世纪得到结果。这是您在 to_date/to_char/to_timestamp 函数中使用 RRRR 格式的结果。 RRRR(和 RR)是 临时 选项,可以为解决千年虫问题争取时间。他们创建了一个滑动窗口,其中世纪是根据提供的年份假设的。事实证明,使用 RR / RRRR 格式只是在 20 年后重新创建 Y2k。停止使用这些格式,始终使用 YYYY 并始终处理 4 位数年份。在 1998-1999 年间,我和数以百万计的同事花费了太多时间,只是为了看到这项工作白费了。
【讨论】:
【参考方案2】:没有更多细节,一个选项(避免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
【讨论】:
【参考方案3】:足以使用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 设置而异
【讨论】:
以上是关于Oracle 字符串到日期到时间戳的主要内容,如果未能解决你的问题,请参考以下文章