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】:

没有更多细节,一个选项(避免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

【讨论】:

【参考方案3】:

足以使用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 设置而异

【讨论】:

以上是关于Oracle 字符串到日期到时间戳的主要内容,如果未能解决你的问题,请参考以下文章

将日期添加到时间戳

Hive 未检测到时间戳格式

BigQuery:字符串到时间戳

BigQuery 字符串到时间戳,在源中保留时区

AWS Glue ETL Spark- 字符串到时间戳

Hive/SparkSQL - 在表达式中键入从日期到时间戳的强制转换