在 oracle 中转换时区?

Posted

技术标签:

【中文标题】在 oracle 中转换时区?【英文标题】:Converting timezones in oracle? 【发布时间】:2018-08-23 09:24:34 【问题描述】:

是否有一个简单的代码可以将给定的日期/时间转换为还应考虑 DST 的差异时区?我有日期时间值(UTC)和要转换的时区。

我知道这可以通过创建存储过程或函数来完成,但只是检查是否有更简单的方法。

【问题讨论】:

Migrating Oracle DATE columns to TIMESTAMP with timezone的可能重复 是的,但是您没有说明要转换到哪个时区,或者您是否希望将其作为查询结果集的一部分,或者您是否正在尝试更改数据输入表格。请编辑您的问题以进一步解释,并包括示例数据和预期结果。 【参考方案1】:

用途:

CAST( date_column AS TIMESTAMP )DATE 数据类型转换为TIMESTAMP 数据类型; FROM_TZ( timestamp_column, 'UTC' )UTC 时区将TIMESTAMP 数据类型转换为TIMESTAMP WITH TIME ZONE 数据类型。 timestamp_with_timezone_column AT TIME ZONE 'EUROPE/LONDON'TIMESTAMP WITH TIME ZONE 数据类型从一个时区转换为另一个时区。

综合起来:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE table_name( date_time ) AS
  SELECT DATE '2018-08-23' FROM DUAL UNION ALL
  SELECT SYSDATE FROM DUAL UNION ALL
  SELECT DATE '2018-12-01' FROM DUAL;

查询1:(也使用TO_CHAR很好地显示TIMESTAMP

SELECT date_time,
       TO_CHAR( FROM_TZ( CAST( date_time AS TIMESTAMP ), 'UTC' ) AT TIME ZONE 'EUROPE/LONDON', 'YYYY-MM-DD"T"HH24:MI:SS.FFTZH:TZM' ) AS london_date_time
FROM   table_name

Results

|            DATE_TIME |                 LONDON_DATE_TIME |
|----------------------|----------------------------------|
| 2018-08-23T00:00:00Z | 2018-08-23T01:00:00.000000+01:00 |
| 2018-08-23T11:20:56Z | 2018-08-23T12:20:56.000000+01:00 |
| 2018-12-01T00:00:00Z | 2018-12-01T00:00:00.000000+00:00 |

【讨论】:

谢谢。这就是我想要的。

以上是关于在 oracle 中转换时区?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 oracle 触发器中转换日期类型变量的时区

Oracle 将带有时区的 TIMESTAMP 转换为 DATE

需要在 oracle 中将任何时区转换为 GMT 时区

如何在java中使用日光将日期格式从一个时区转换为另一种时区[重复]

c#时区转换

Oracle:本地时区,区分双小时2