我正在尝试转换格式的时间戳值 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` 感谢您的帮助。谢谢!
2条答案
按热度按时间4uqofj5v1#
可以分别转换字符串和偏移量;
to_timestamp()
给你一个简单的时间戳(没有时区),你可以声明它来自一个特定的时间戳,这基本上是你已经在做的事情。结果是一个带有时区的时间戳。然后使用at time zone
转换成另一个。最后你可以把它转换成一个字符串:我将使用不同的偏移量使其更清晰:
你不需要这些单独的结果,当然,我只是展示工作。
当您希望最终使用utc时,您可以使用一个内置函数来稍微简化它:
db<>小提琴
或者,您可以将两个字符串连接在一起,并将它们直接转换为带时区的时间戳:
db<>小提琴
日期或时间戳(带或不带时区)没有任何真正可识别的格式;根据上下文的不同,oracle使用了几种内部表示。如果不显式转换为字符串
to_char()
然后,您的客户机将通过自己的设置或通常通过会话nls参数来决定要使用的格式,NLS_DATE_FORMAT
,NLS_TIMESTAMP_FORMAT
等等。不过,你应该只为展示而这样做。在表中存储数据时,请为列使用正确的本机数据类型—在本例中为时间戳。不要将其存储为字符串。假设您的目标表列实际上是一个时间戳,并且源暂存表具有字符串,那么您将执行以下操作:
与数据类型同名的列很容易混淆,源表和目标表中的同名也是如此。
gcxthw6b2#
我想这可能是因为你的会话时间格式。你也可以用这种方法检查。
输出: