日期/时间不同时区之间的转换

时间:2016-11-18 12:15:52

标签: sql oracle timezone

我使用以下sql将日期/时间值从一个时区转换为另一个时区

from_tz(cast(to_date(to_char(q.created_date, 'DDMMYYYY:HH24:MI:SS'),
    'DDMMYYYY:HH24:MI:SS') as timestamp), 'Europe/London') at time zone 'America/New_York'
    else null end as Message_Rcd_Date_Time

以上输出如下:

29-OCT-2016 14:28:16.000000 -04:00

我想要做的是输出这个日期/时间,如下所示,不包括时区,你能告诉我为了达到这个目的我需要改变什么吗?

29-OCT-2016 14:28:16

2 个答案:

答案 0 :(得分:0)

不确定Oracle,但在查询之下可以提供帮助。

  SELECT SUBSTR((cast(to_date(to_char(q.created_date, 'DDMMYYYY:HH24:MI:SS'),
        'DDMMYYYY:HH24:MI:SS') as timestamp), 'Europe/London') , 1, 20) at time zone 'America/New_York'
    else null end as Message_Rcd_Date_Time;

如果它只是SQL Server LEFT函数就可以了。

答案 1 :(得分:0)

首先让我们解散你的表达

FROM_TZ(CAST(TO_DATE(TO_CHAR(q.created_date, 'DDMMYYYY:HH24:MI:SS'), 'DDMMYYYY:HH24:MI:SS') AS TIMESTAMP), 'Europe/London') AT TIME ZONE 'America/New_York'

确实如下:

  1. TO_CHAR(q.created_date, 'DDMMYYYY:HH24:MI:SS') - >将created_date值转换为VARCHAR2
  2. TO_DATE(..., 'DDMMYYYY:HH24:MI:SS') - >将其转换回DATE
  3. CAST(... AS TIMESTAMP) - >将其转换为TIMESTAMP(不带时区)
  4. FROM_TZ(..., 'Europe/London') - >附上时区'欧洲/伦敦'对它
  5. ... AT TIME ZONE 'America/New_York' - >转换为时区' America / New_York'
  6. 第1,2和3点没用!由于created_dateTIMESTAMP,您可以缩短

    TO_CHAR(FROM_TZ(q.created_date, 'Europe/London') AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI:SS')
    

    如果您的SESSIONTIMEZONEEurope/London,您甚至可以

    TO_CHAR(q.created_date AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI:SS')