将UTC时间转换为oracle中的特定时区

将UTC时间转换为oracle中的特定时区,oracle,Oracle,我必须将UTC时间转换为特定时区,我已经将sysdate转换为UTC,现在我想将其转换为特定时区,这就是我将sysdate转换为UTC的方式 select cast(sys_extract_utc(systimestamp) as DATE) from dual; 我以前试过从关键字中写入+5,但它会在5天后返回日期 select cast(sys_extract_utc(systimestamp) as DATE)+5 from dual; 我已经通过下面的查询得到了时区偏移量,但我有在上

我必须将UTC时间转换为特定时区,我已经将sysdate转换为UTC,现在我想将其转换为特定时区,这就是我将sysdate转换为UTC的方式

select cast(sys_extract_utc(systimestamp) as DATE) from dual;
我以前试过从关键字中写入+5,但它会在5天后返回日期

select cast(sys_extract_utc(systimestamp) as DATE)+5 from dual;
我已经通过下面的查询得到了时区偏移量,但我有在上面的查询中使用它的线索

SELECT TZ_OFFSET('US/Eastern') FROM DUAL;
如何将UTC时间转换为某些时区偏移量,如下所示

select cast(sys_extract_utc(systimestamp) as DATE) from dual where TZ_OFFSET=+5;

您可以使用以下方式获取当前UTC时间:

SELECT CAST( SYSTIMESTAMP AT TIME ZONE 'UTC' AS DATE )
FROM   DUAL;
您可以使用以下方法将UTC
日期更改为
时区时间戳的过程反转为
+04:00

SELECT FROM_TZ( CAST( your_date AS TIMESTAMP ), 'UTC' ) AT TIME ZONE '+04:00'
FROM   your_table

您可以使用以下方式获取当前UTC时间:

SELECT CAST( SYSTIMESTAMP AT TIME ZONE 'UTC' AS DATE )
FROM   DUAL;
您可以使用以下方法将UTC
日期更改为
时区时间戳的过程反转为
+04:00

SELECT FROM_TZ( CAST( your_date AS TIMESTAMP ), 'UTC' ) AT TIME ZONE '+04:00'
FROM   your_table

试图增加时区偏移量会给您带来夏令时调整方面的问题

可以使用指定转换,但不需要先转换为UTC。如果你这样做,你可能得不到你所期望的,而不采取额外的步骤:

select systimestamp as sys_ts,
  sys_extract_utc(systimestamp) as utc_ts,
  sys_extract_utc(systimestamp) at time zone 'US/Eastern' as edt_ts
from dual;

SYS_TS                         UTC_TS                  EDT_TS                            
------------------------------ ----------------------- ----------------------------------
2017-10-05 11:30:41.023 +01:00 2017-10-05 10:30:41.023 2017-10-05 05:30:41.023 US/EASTERN
也就是说,纽约的时间是05:30,而写作时实际上是06:30

sys\u extract\u utc
函数为您提供与系统时间相等的utc时间,但嵌入了时区信息-它是一个普通的时间戳,而不是带有时区的时间戳。因此,当您调整它时,它会隐式地转换为系统时区,而不进行调整,留下错误的实际时间

可以使用以下命令指定提取的值为UTC:

但您不需要做那么多工作,只需获取原始时区感知值
systimestamp
并将
在时区直接应用到该值:

select systimestamp as sys_ts,
  systimestamp at time zone 'US/Eastern' as edt_ts
from dual;

SYS_TS                         EDT_TS                            
------------------------------ ----------------------------------
2017-10-05 11:30:41.271 +01:00 2017-10-05 06:30:41.271 US/EASTERN
如果需要,则可以将其转换为日期数据类型:

cast(from_tz(sys_extract_utc(systimestamp), 'UTC') at time zone 'US/Eastern' as date)
或者更简单地说:

cast(systimestamp at time zone 'US/Eastern' as date)

试图增加时区偏移量会给您带来夏令时调整方面的问题

可以使用指定转换,但不需要先转换为UTC。如果你这样做,你可能得不到你所期望的,而不采取额外的步骤:

select systimestamp as sys_ts,
  sys_extract_utc(systimestamp) as utc_ts,
  sys_extract_utc(systimestamp) at time zone 'US/Eastern' as edt_ts
from dual;

SYS_TS                         UTC_TS                  EDT_TS                            
------------------------------ ----------------------- ----------------------------------
2017-10-05 11:30:41.023 +01:00 2017-10-05 10:30:41.023 2017-10-05 05:30:41.023 US/EASTERN
也就是说,纽约的时间是05:30,而写作时实际上是06:30

sys\u extract\u utc
函数为您提供与系统时间相等的utc时间,但嵌入了时区信息-它是一个普通的时间戳,而不是带有时区的时间戳。因此,当您调整它时,它会隐式地转换为系统时区,而不进行调整,留下错误的实际时间

可以使用以下命令指定提取的值为UTC:

但您不需要做那么多工作,只需获取原始时区感知值
systimestamp
并将
在时区直接应用到该值:

select systimestamp as sys_ts,
  systimestamp at time zone 'US/Eastern' as edt_ts
from dual;

SYS_TS                         EDT_TS                            
------------------------------ ----------------------------------
2017-10-05 11:30:41.271 +01:00 2017-10-05 06:30:41.271 US/EASTERN
如果需要,则可以将其转换为日期数据类型:

cast(from_tz(sys_extract_utc(systimestamp), 'UTC') at time zone 'US/Eastern' as date)
或者更简单地说:

cast(systimestamp at time zone 'US/Eastern' as date)

感谢您的回答,我只想要特定时区的日期和时间,我尝试了这个查询,但它给了我错误的时间从dual中选择cast(时区'US/Eastern'的sys_extract_utc(SytimeStamp)作为日期)作为edt@萨尔曼-是的,我在回答中说,你会从这个问题中得到错误的答案。您已经运行了我显示的第一个查询,我说它不会满足您的期望。您是否尝试了第二个或第三个查询?感谢您的回答,我只想知道特定时区的日期和时间,我尝试了此查询,但它给了我错误的时间从dual中选择cast(时区“US/Eastern”处的sys_extract_utc(系统时间戳)作为日期)作为edt@萨尔曼-是的,我在回答中说,你会从这个问题中得到错误的答案。您已经运行了我显示的第一个查询,我说它不会满足您的期望。您尝试过第二个或第三个查询了吗?谢谢,反向查询成功了,我已经从以下位置执行了选择转换(从_TZ(cast(sys_extract_utc(systimestamp)作为时间戳),'utc')在时区“-4:00”作为日期)dual@Salman为什么这么复杂<代码>从DUAL中选择CAST(时区的SYSTIMESTAMP'-04:00'作为日期)将执行相同的操作!我只需要得到日期和时间,不需要任何其他信息这就是为什么,请你推荐其他的好吗option@Salman我在前面的评论中给你的陈述完全是这样的,没有将时间戳更改为UTC时区,然后更改为日期,然后再更改为不带时区的时间戳,然后更改为UTC的时间戳,然后更改为不同的时区,然后再更改为日期。谢谢,反向查询工作正常,我已在时区“-4:00”作为日期,从dual@Salman为什么这么复杂<代码>从DUAL中选择CAST(时区的SYSTIMESTAMP'-04:00'作为日期)将执行相同的操作!我只需要得到日期和时间,不需要任何其他信息这就是为什么,请你推荐其他的好吗option@Salman我在前面的评论中给你的陈述完全是这样的,没有将时间戳更改为UTC时区,然后更改为日期,然后再更改为不带时区的时间戳,然后更改为UTC的时间戳,然后更改为不同的时区,然后再更改为日期的复杂情况。