目录

一、问题描述

二、原因分析

三、解决办法


操作系统 Oracle Linux 8

数据库版本Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

一、问题描述

在使用oracle数据库的项目中发现sysdate,systimestamp很current_date,current_timestamp的时间不一致。

具体查询结果如下

select sysdate from dual;

-- 下面是返回结果
SYSDATE
2024-08-21 10:43:19.000


select current_date from dual;

-- 下面是返回结果
CURRENT_DATE
2024-08-21 04:43:38.000


select current_timestamp from dual;

-- 下面是返回结果
CURRENT_TIMESTAMP
2024-08-21 04:44:03.153 +0200

select systimestamp from dual;

-- 下面是返回结果
SYSTIMESTAMP
2024-08-21 10:44:58.048 +0800
二、原因分析

在Linux上,Oracle数据库中SYSDATE和CURRENT_DATE函数返回的日期时间应该是一致的,因为它们都是基于服务器的操作系统时间。如果出现SYSDATE和CURRENT_DATE不一致的情况,可能是Oracle数据库可能配置了错误的时区,导致显示的时间不正确。

前提是我们要确保操作系统时区和时间是准确的。

三、解决办法

1.通过查询DBTIMEZONE和SESSIONTIMEZONE来检查Oracle数据库的时区设置是否正确

SELECT DBTIMEZONE, SESSIONTIMEZONE FROM DUAL;

-- 下面是返回结果

DBTIMEZONE  SESSIONTIMEZONE

+00:00	Europe/Berlin

当前正确的SESSIONTIMEZONE应该是Asia/Shanghai

2.要设置所有新会话的默认SESSIONTIMEZONE,使用以下命令

ALTER PROFILE DEFAULT LIMIT SESSIONTIMEZONE TO 'Asia/Shanghai';

这里是修改默认profile (DEFAULT),如果user使用其他的profile需要先根据user查询出profile,再修改profile的设置

-- 查询出数据库账号指定的profile

SELECT PROFILE FROM DBA_USERS WHERE USERNAME = 'ILOVECHINA';

-- 更改该用户的配置文件

ALTER PROFILE your_profile LIMIT SESSIONTIMEZONE TO 'Asia/Shanghai';

3.更改DBTIMEZONE和SESSIONTIMEZONE设置后,新的会话将使用新的时区设置。注意,这些更改可能需要重启数据库才能完全生效

Logo

一站式 AI 云服务平台

更多推荐