字符串到时间戳转换plsql

string to timestamp conversion plsql

我从 timestamp 外部来源继承了一些数据。这是某人作为 varchar2 放入仓库的。我需要将其转换为合法的 timestamp 但不确定如何。这就是字符串的样子。 “2021-04-23T11:02:17.00Z”。

非常感谢您的帮助。

PS 理想情况下,我还想知道如何将其截断为更传统的 DD-MMM-YYYY 日期格式,例如21-Jan-2021 甚至 DD-MM-YYYY 都可以。

应该不会太难。提取“日期”部分,对其应用 TO_DATE 函数(使用适当的格式掩码),仅此而已。这意味着您应该在以下查询中“停止”在 date_value 处。最后一个 final_result 又是一个字符串,只是按照您想要的格式设置了格式。

SQL> with test (col) as
  2    (select '2021-04-23T11:02:17.00Z' from dual)
  3  select substr(col, 1, 10) string,
  4    --
  5    to_date(substr(col, 1, 10), 'yyyy-mm-dd') date_value,
  6    --
  7    to_char(to_date(substr(col, 1, 10), 'yyyy-mm-dd'), 'dd-mm-yyyy') final_result
  8  from test;

STRING     DATE_VALUE FINAL_RESU
---------- ---------- ----------
2021-04-23 2021-04-23 23-04-2021

SQL>

为了避免这种“操作”,您甚至可以创建一个视图。例如:

这是 table 您目前拥有:

SQL> create table test as
  2    (select 1 id, 'Littlefoot' name, '2021-04-23T11:02:17.00Z' col from dual);

Table created.

创建一个视图,重新使用我在上面发布的代码:

SQL> create or replace view v_test as
  2    select id, name,
  3      to_date(substr(col, 1, 10), 'yyyy-mm-dd') col
  4  from test;

View created.

Select 来自:

SQL> select * from v_test;

        ID NAME       COL
---------- ---------- ----------
         1 Littlefoot 2021-04-23

需要其他格式?没问题:

SQL> alter session set nls_date_format = 'dd-mon-yyyy';

Session altered.

SQL> select * from v_test;

        ID NAME       COL
---------- ---------- -----------
         1 Littlefoot 23-apr-2021

SQL>

或者,将 TO_CHAR 应用于视图的 col 列(也在我首先发布的代码中进行了演示;请参阅 final_result)。

您可以使用 TO_TIMESTAMP 函数来执行此操作。

尝试:

TO_TIMESTAMP('2021-04-23T11:02:17.00Z', 'YYYY-MM-DDTHH:MI:SS')

您可以在他们的 Documentation

中阅读有关此功能的更多信息

to_timestamp_tz()得到对应的timstamp with time zone,用AT TIME ZONE和[=15=转换成你想要的时区(比如sessiontimezone) ] 到 timestamp.

SELECT cast(to_timestamp_tz('2021-04-23T11:02:17.00Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF2:TZR') AT TIME ZONE sessiontimezone AS timestamp)
       FROM dual;

db<>fiddle