convert\u tz()等价

nr9pn0ug  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(418)

我正在尝试转换格式的时间戳值 YYYY-MM-DDTHH24:MI:SS 另一个时区值 YYYY-MM-DD HH24:MI:SS.SSSSSS . 我可以在mysql中使用 CONVERT_TZ(date, from_tz, to_tz) 功能,

timestamp (varchar): `2018-06-08T23:00:00`
offset (varchar): `+00:00`
``` `convert_tz(timestamp, offset, '+00:00') = 2018-06-08 23:00:00` 工作正常
我怎么能在甲骨文里做同样的事情呢?
我想传递这3个值(timestamp,offset,“+00:00”),并尝试使用 `from_tz()` 在oracle中,但只能传递两个值(timestamp,offset),如何传递第三个值('+00:00')?
我的问题是:

INSERT INTO CLIENTTABLE(id, timestamp, orgId) SELECT NULL, from_tz(to_timestamp('2018-06-08T23:00:00', 'YYYY-MM-DD"T"HH24:MI:SS') ,'+00:00'), '1010' FROM IMPORTDATA;

这将提供: `08-JUN-18 11.00.00.000000000 PM +00:00` 期望输出: `2018-06-08 23:00:00.000000` 感谢您的帮助。谢谢!
4uqofj5v

4uqofj5v1#

可以分别转换字符串和偏移量; to_timestamp() 给你一个简单的时间戳(没有时区),你可以声明它来自一个特定的时间戳,这基本上是你已经在做的事情。结果是一个带有时区的时间戳。然后使用 at time zone 转换成另一个。最后你可以把它转换成一个字符串:
我将使用不同的偏移量使其更清晰:

select to_timestamp('2018-06-08T23:00:00', 'YYYY-MM-DD"T"HH24:MI:SS') as ts,
  from_tz(
    to_timestamp('2018-06-08T23:00:00', 'YYYY-MM-DD"T"HH24:MI:SS'),
    '+05:30'
  ) as tstz_local,
  from_tz(
    to_timestamp('2018-06-08T23:00:00', 'YYYY-MM-DD"T"HH24:MI:SS'),
    '+05:30'
  ) at time zone 'UTC' as tstz_utc,
  to_char(
    from_tz(
      to_timestamp('2018-06-08T23:00:00', 'YYYY-MM-DD"T"HH24:MI:SS'),
      '+05:30'
    ) at time zone 'UTC',
    'YYYY-MM-DD HH24:MI:SS.FF6'
  ) as str_utc
from dual;

你不需要这些单独的结果,当然,我只是展示工作。
当您希望最终使用utc时,您可以使用一个内置函数来稍微简化它:

select to_char(
  sys_extract_utc(
    from_tz(
      to_timestamp('2018-06-08T23:00:00', 'YYYY-MM-DD"T"HH24:MI:SS'),
      '+05:30'
    )
  ), 'YYYY-MM-DD HH24:MI:SS.FF6') as str_utc
  as tstz_utc,
from dual;

STR_UTC
--------------------------
2018-06-08 17:30:00.000000

db<>小提琴
或者,您可以将两个字符串连接在一起,并将它们直接转换为带时区的时间戳:

select to_char(
  sys_extract_utc(
    to_timestamp_tz('2018-06-08T23:00:00' || '+05:30',
      'YYYY-MM-DD"T"HH24:MI:SS TZH:TZM')
  ), 'YYYY-MM-DD HH24:MI:SS.FF6') as str_utc
from dual;

db<>小提琴
日期或时间戳(带或不带时区)没有任何真正可识别的格式;根据上下文的不同,oracle使用了几种内部表示。如果不显式转换为字符串 to_char() 然后,您的客户机将通过自己的设置或通常通过会话nls参数来决定要使用的格式, NLS_DATE_FORMAT , NLS_TIMESTAMP_FORMAT 等等。
不过,你应该只为展示而这样做。在表中存储数据时,请为列使用正确的本机数据类型—在本例中为时间戳。不要将其存储为字符串。假设您的目标表列实际上是一个时间戳,并且源暂存表具有字符串,那么您将执行以下操作:

INSERT INTO CLIENTTABLE(id, timestamp, orgId)
SELECT
  NULL,
  sys_extract_utc(
    from_tz(
      to_timestamp(timestamp, 'YYYY-MM-DD"T"HH24:MI:SS'),
      offset
    )
  ),
  '1010'
FROM IMPORTDATA;

与数据类型同名的列很容易混淆,源表和目标表中的同名也是如此。

gcxthw6b

gcxthw6b2#

我想这可能是因为你的会话时间格式。你也可以用这种方法检查。

alter session set nls_Date_format = 'YYYY-MM-DD HH24:MI:SS';
SELECT NULL valun, cast(from_tz(to_timestamp('2018-06-08T23:00:00', 'YYYY-MM-DD"T"HH24:MI:SS') ,'+00:00') as date) timen, '1010' idn FROM dual;

输出:

相关问题