我在这里尝试将日期列值从CET
转换为CST
。
我尝试使用NEW_TIME(SYSDATE ,'CET','CST')
函数,但它给出了一个错误,说明了未知的时区。此处的问题是CET
无法被oracle识别为有效时区。
我最初尝试使用“at timezone”方法,但它将时区名称插入到我不想要的列值中。
答案 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