Oracle更改夏令时的时间戳列值

问题描述

我有一个timestamp列,其值是12/02/2019 02:00:00。但是,当夏时制的几个月到来时,该值将自动更改为12/02/2019 01:00:00。现在,如果我将时区设置为欧洲/伊斯坦布尔,它将变为原始值。但是当夏令时发生时,我必须每隔几个月更改一次时区。我需要查询返回原始值。同样,对于正常月份,我必须将时区设置为亚洲/伊斯坦布尔,否则值将向前更改。

解决方法

如果您的列是用timestamp with local time zone数据类型定义的,则它将与数据库时区一起存储,并与 session 时区一起显示。

在此示例中,查看C3列的显示的值(而不是存储的值)如何从20:28更改为21:28:

SQL> create table t (
   c1 timestamp,c2 timestamp with time zone,c3 timestamp with local time zone
);

SQL> alter session set time_zone = 'Europe/Rome';

SQL> insert into t (c1,c2,c3) values (systimestamp,systimestamp,systimestamp);

SQL> select * from t;

C1                                                 C2                                  C3                                 
-------------------------------------------------- ----------------------------------- -----------------------------------
20/08/2020 20:28:17.942586                         20/08/2020 20:28:17.942586 +02:00   20/08/2020 20:28:17.942586

SQL> alter session set time_zone = 'Europe/Istanbul';

SQL> select * from t;

C1                                                 C2                                  C3                                 
-------------------------------------------------- ----------------------------------- -----------------------------------
20/08/2020 20:28:17.942586                         20/08/2020 20:28:17.942586 +02:00   20/08/2020 21:28:17.942586         

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...