如何在SQL查询中将列时区从CET转换为CST

时间:2016-02-03 11:26:39

标签: sql oracle

我在这里尝试将日期列值从CET转换为CST。 我尝试使用NEW_TIME(SYSDATE ,'CET','CST')函数,但它给出了一个错误,说明了未知的时区。此处的问题是CET无法被oracle识别为有效时区。

我最初尝试使用“at timezone”方法,但它将时区名称插入到我不想要的列值中。

2 个答案:

答案 0 :(得分:0)

要删除时区,您可以使用cast(.... as Timesamp)。 检查我的例子。

select cast( current_timestamp at time zone 'CST' as timestamp), cast( current_timestamp at time zone 'CST' as timestamp with time zone) from dual;

答案 1 :(得分:0)

三个字符的时区不适合夏令时。为此,您需要使用完全指定的时区名称。为了说明,在加拿大,有中央标准时间,但萨斯喀彻温省不使用夏令时,所以如果我想现在转换到夏季的当地时间,在那里夏令时,并知道正确的完全指定的时区数据库时区文件中的名称(您可以通过从V $ TIMEZONE_NAMES中选择*来检查数据库中安装的列表):

SELECT 'Central' locale
      , extract(timezone_abbr from cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Central') tz_abbrv
      , CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Central' as timestamp) local_time from dual
union all
SELECT 'Saskatchewan' locale
      , extract(timezone_abbr from cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Saskatchewan') tz_abbrv
     , CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Saskatchewan' as timestamp) local_time from dual;

LOCALE       TZ_ABBRV   LOCAL_TIME                          
Central      CDT        03/08/2016 9:57:24.000000 AM        
Saskatchewan CST        03/08/2016 8:57:24.000000 AM        

否则,您需要在计算中编码何时在CST和DST之间切换 - 请记住,夏令时开始和结束的规则随着时间的推移而变化,并且可能在将来再次发生变化。

因此,请回复有关插入的注释,首先需要确保将列定义为包含时区(数据类型"带时区的时间戳"),并从" timestamp&更改CAST #34;到"带时区的时间戳"确保存储区域信息:

e.g。)

create table mbt (stz timestamp with time zone)

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Indian/Maldives' as timestamp with time zone) )

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Eastern' as timestamp with time zone) )

commit;

select * from mbt;

STZ                                        
05/08/2016 8:06:49.000000 PM +05:00        
05/08/2016 11:06:50.000000 AM -04:00       

如果您不包含WITH TIME ZONE,您仍然应该获得更改后的值,但是您将无法轻松地从当地时间转换到其他时区,因为这些值将被假定为在服务器时区:

drop table mbt;

create table mbt (stz timestamp);

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Indian/Maldives' as timestamp) );

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE 'Canada/Eastern' as timestamp ) );

commit;

select * from mbt;


STZ                            
-------------------------------
05-AUG-16 08.13.16.000000 PM   
05-AUG-16 11.13.16.000000 AM