Oracle 时区详解

1 简介

由于地球经纬度及地球自转引起的经度方向,不同的经度的地方,所感受到的昼夜是不同 的。有关国际会议决定将地球表面按经线从东到西,每隔经度15度划分一个时区,并且规定 相邻区域的时间相差1小时。

这就是时区的由来。

而实际使用中,往往不是严格按照这个标准来做的。国家的存在,为了行政工作的方便,一 个国家都有一个本国的标准时,大部分国家以首都所在的时区作为国家的标准时。比如, 我大中国以北京所在时区(东八区)作为中国的标准时。在IT领域,很多时候我们都会涉及 到时区的问题。很不幸的是,很多计算机方面的标准都是西欧、北美这些发达国家定制 的.比如东八区的时区名,并不是Beijing,而是Shanghai,当然,完整的时区名应该是 “Asia/Shanghai”.

1884年在华盛顿召开的国际经度会议决定以经过格林尼治的经线为本初子午线,是世界计 算时间和地理经度的起点,也是世界标准时,又称其为格林尼治标准时, 其时区名为 UT. 而由于世界原子时(纳秒为基础)与世界时(毫秒为基础)的计算单位不同,两者之间的差别会 越来越大,各政府更倾向于以自然时间UT为标准,因此世界原子时需要向世界时靠拢,于 1972年,世界上达成一致解决方案即为:协调世界时,即UTC。随后UTC,即成为了各个领 域特别是IT行业的时间标准。

而UTC的由来,不过是国力强弱之争妥协的产物。英文(CUT)和法文(TUC)的缩写不同, 作为妥协,简称UTC。

很多同仁在工作时,不会特别关注时区问题,即使用默认的时间配置,而在处理实际数据 的时候才发现,操作时间或者系统显示时间与本地时间相差了几个小时,在我大中国,一 般就是相差8个小时。只要你遇到了反馈时间与实际时间相差8个小时的情况,你就往时区 方面去考虑,这个方向基本上是正确的。

2 Oracle TimeZone

2.1 时区文件

Oracle 将支持的时区信息,比如时区名,时区缩写名都保存在文件中。文件的默认存储 路径为$ORACLE_HOME/oracore/zoneinfo/ 及其子路径中(big和little). 这些路径中中的 同名文件,其实是一样的。都是二进制文件,但是从文件大小来看,可以判断,同名文件 虽然在不同的路径中,但是文件内容是一样的。

文件的内容,在数据库启动时,会自动加载,并呈现在视图"V$TIMEZONE_FILE" 中,告知我 们, 数据库现在使用的是哪个文件。

文件分为两种类型:timezlrg_version.dat和timezone_version.dat .

2.2 时区名字

关于Oracle支持的时区,基本上涵盖了已知的常用的时区。

数据库启动时通过文件加载的内容,呈现在视图:V$TIMEZONE_NAMES 中。

SQL> col tzname for a20
SQL> col tzabbrev for a10
SQL> select * from V$TIMEZONE_NAMES where tzname = 'Asia/Shanghai';TZNAME               TZABBREV       CON_ID
-------------------- ---------- ----------
Asia/Shanghai        LMT                 0
Asia/Shanghai        CST                 0
Asia/Shanghai        CDT                 0

可以看到查到了三个值:

  • LMT(Local Mean Time) :全球标准时间,UTC的前身, 这个基本不用了。
  • CST(China Standard Time) :中国标准时间, 有其他的解释
  • CDT(Central Daylight Time):中部夏令时间,主要用于北美,比UTC晚5小时。另外,还可以理解成(Cuba Daylight Time)古巴夏令时。

更多的时区查询可以去:https://datetime360.com/cn/worldwide-city-list/ 查询。

由于缩写中有很多同名的,为了避免冲突,我们一般使用全名。

3.Oracle 时区设置

Oracle 的时区可以分为两种,一种是数据库的时区,一种是 session 时区,也就是客户端连接时的时区。

数据库的时区在创建数据库时可以通过在 create database 语句中加上 SET TIME_ZONE = ’ { { + | - } hh : mi | time_zone_region } ’ 来指定,如果,不指定,默认是按照数据库所在的操作系统时区来设定的。

--创建数据库时指定时区CREATE DATABASE databasename SET TIME_ZONE='Asia/Shanghai';

创建之后,可以通过 alter database 来修改。其中 time_zone_region 参数可以通过查询 V$TIMEZONE_NAMES 动态视图来获得所有支持的值。修改之后,需要重启数据库才能生效。

Session 的时区是根据客户端的时区来决定的,当然连接以后也可以通过 alter session 来改变。WITH LOCAL TIME ZONE 类型会根据 TIME_ZONE 的设置,自动把时间转换为 session 所在时区的时间显示出来,而 WITH TIME ZONE 因为保存了时区,不需要根据 TIME_ZONE 的设置来转换。

3.1 查看时区

可以分别使用 SESSIONTIMEZONE / DBTIMEZONE 内建函数查看 session 和数据库时区:
查看会话时区:

SQL> select sessiontimezone from dual;SESSIONTIMEZONE
---------------------------------------------------------------------------
+08:00

查看数据库时区:

SQL> select dbtimezone from dual;DBTIME
------
+08:00

SELECT property_name, property_value
FROM database_properties
WHERE property_name='DBTIMEZONE';

SELECT name, value$
FROM sys.props$
WHERE name='DBTIMEZONE';

3.2 调整时区

调整会话时区:

(1)SQL 命令

---示例ALTER SESSION SET TIME_ZONE = local;ALTER SESSION SET TIME_ZONE = dbtimezone;ALTER SESSION SET TIME_ZONE = '+08:00';ALTER SESSION SET TIME_ZONE = 'Asia/Shanghai';

(2)环境变量

$ ORA_SDTZ='-05:00'
$ export ORA_SDTZ

调整数据库时区(需要重启数据库)

--示例ALTER DATABASE SET TIME_ZONE = '-05:00';ALTER DATABASE SET TIME_ZONE = 'Europe/Lisbon';

修改数据库时区时可能会遇到如下报错:

SQL> alter database set time_zone='+06:00';
alter database set time_zone='+06:00'
*
ERROR at line 1:
ORA-02231: missing or invalid option to ALTER DATABASE

TOM 对此问题有过解释,TIME_ZONE 的设定主要是为了 WITH LOCAL TIME ZONE,当 session 的时区和数据库的时区不同时,oracle 根据时区的差距转换到数据库的时间,再保存到数据库的 WITH LOCAL TIME ZONE 类型中,他是不保存时区的,所以需要 TIME_ZONE 来进行各种时区之间时间的转换(WITH TIME ZONE 类型保存了原始的时区,所以不需要 TIME_ZONE 的设置也可以进行各种时区之间的转换)。但数据库中一旦有了该类型,就不能通过 alter database 修改时区了,会得到上面的错误,可以通过下面的语句获得所有包含该类型的表,将他们删除之后,再修改。

select u.name || '.' || o.name || '.' || c.name TSLTZcolumnfrom sys.obj$ o, sys.col$ c, sys.user$ u
where c.type# = 231and o.obj# = c.obj#and u.user# = o.owner#;

一般查询后的结果为:OE.ORDERS.ORDER_DATE,指的是OE用户下的ORDERS表的ORDER_DATE字段使用了时区的信息:WITH LOCAL TIME ZONE,将此信息去掉就可以再修改了,修改好了之后需要重启数据库才能生效。

更多内容可参考文章《oracle DBTIMEZONE 时区调整》

3.3 查询在指定时区的当地时间

SQL> SELECT TZ_OFFSET('Asia/Shanghai') FROM DUAL;TZ_OFFS
-------
+08:00SQL> SELECT TZ_OFFSET('Europe/London') FROM DUAL;TZ_OFFS
-------
+01:00

3.4 查询某时区和 UTC 之间的差值。

TZ_OFFSET ( { ‘time_zone_name’
| ‘{ + | - } hh : mi’
| SESSIONTIMEZONE
| DBTMEZONE }
)

SQL> SELECT TZ_OFFSET('US/Eastern') FROM DUAL;TZ_OFFS
-------
-04:00SQL>  SELECT TZ_OFFSET(DBTIMEZONE) FROM DUAL;TZ_OFFS
-------
+08:00

其中 time_zone_name 也可以从 V$TIMEZONE_NAMES 获得。

4. Oracle 时间函数

Oracle 9i 开始多了 3 个关于时间的数据类型:

  • TIMESTAMP [(precision)]
  • TIMESTAMP [(precision)] WITH TIME ZONE
  • TIMESTAMP [(precision)] WITH LOCAL TIME ZONE

其中 TIMESTAMP [(precision)] WITH TIME ZONE 保存了时区信息。

sysdate/systimestamp 都是返回数据库的时间并且使用数据库的时区,他们返回的是操作系统的时间。

  • sysdate 返回的是 date 类型,没有时区信息,操作系统上是什么时间就返回什么时间;
  • systimestamp 返回 TIMESTAMP WITH TIME ZONE 类型,有时区信息。
SQL> select sysdate from dual;SYSDATE
---------
25-AUG-23SQL>  select systimestamp from dual;SYSTIMESTAMP
---------------------------------------------------------------------------
25-AUG-23 11.38.48.569294 AM +08:00

参考文章:
https://www.cnblogs.com/firstyi/archive/2007/09/24/903931.html
https://www.cnblogs.com/halberd-lee/p/11245549.html
https://my.oschina.net/lvkun0223/blog/14438?p=

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/52021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

营销数字化|企业级 AIGC 工具的「iPhone 时刻」

2007 年,乔布斯发布了第一款 iPhone,从此彻底改变了手机行业的市场走向。iPhone 成功的背后,一个很重要的原因是:它让用户以更简单、更符合直觉的方式来使用手机。 如今,AIGC 工具也在等待它的「iPhone 时刻」&#xf…

【Spring Boot】使用Spring Boot进行transformer的部署与开发

Transformer是一个用于数据转换和处理的平台,使用Spring Boot可以方便地进行Transformer的部署与开发。 以下是使用Spring Boot进行Transformer部署与开发的步骤: 创建Spring Boot项目 可以使用Spring Initializr创建一个简单的Spring Boot项目。在创…

解决方法:Linux python3.10回退python3.8

一、问题 在 Matter SDK 通过运行激活脚本开始构建环境部署 source scripts/activate.sh 时,出现 Getting requirements to build wheel: startederror: subprocess-exited-with-error Getting requirements to build wheel did not run successfully.│ exit cod…

C#_委托详解

委托是什么? 字面理解:例如A要建一栋别墅,找到B建筑施工队,请B来建筑别墅。 委托类型规定方法的签名(方法类型):返回值类型、参数类型、个数、顺序。 委托变量可以用来存储方法的引用&#x…

什么是响应式图片?如何在网页中实现响应式图片?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 响应式图片&#xff08;Responsive Images&#xff09;⭐ 实现响应式图片的方法1. 使用<img>标签的srcset属性2. 使用<picture>元素3. 使用CSS的max-width属性4. 使用响应式图片库 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&…

Android 13.0 强制app横屏显示

1.概述 在13.0产品定制化开发中,对于处理屏幕旋转方向,首先有kernel底层处理,从底层驱动gsensor 中获取数据,从而判断屏幕方向的,然后事件上报后 最后由WMS就是WindowManagerService 来处理旋转的相关事件 2.强制app横屏显示的核心类 /framework/base/services/java/com…

懵了,面试官问我Redis怎么测,我哪知道!

有些测试朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么测…

缺少代码签名证书会怎么样?

在当下恶意软件攻击频发的情形下&#xff0c;使用代码签名证书来保护代码安全已经成为每个软件开发商的基本认知。代码签名证书将保护软件代码的完整性&#xff0c;避免软件被非法篡改或植入恶意代码病毒&#xff0c;从而使得软件可以正常运行。那么如果软件缺少代码签名证书会…

vue-canvas基本使用和注意事项-动画闪烁效果-自适应适配不同分辨率问题

前言 canvas画布是html的新特性&#xff0c;熟悉画布我们可以完成很多拖拽&#xff0c;标注&#xff0c;动画的功能 使用canvas实现一个小例子很容易&#xff0c;但是真正在项目中使用时&#xff0c;我们需要注意的地方有很多 canvas基本原理就是它基于渲染方法&#xff0c;根…

小程序页面间有哪些传递数据的方法?

使用全局变量实现数据传递 在 app.js 文件中定义全局变量 globalData&#xff0c; 将需要存储的信息存放在里面使用的时候&#xff0c;直接使用 getApp() 拿到存储的信息 App({// 全局变量globalData: {userInfo: null} }) 使用 wx.navigateTo 与 wx.redirectTo 的时候&…

WebGL 绘制圆点

前言 这篇文章不说WebGL相关概念了&#xff0c;初学者先到网上看看WebGL相关概念。这里着重写一下在vue3前端框架下&#xff0c;如何通过webGL绘制圆点。 着色器代码(画点) 画点相关的着色器代码有顶点着色器和片元着色器&#xff0c;代码如下&#xff1a; 顶点着色器&…

mysql 8.0 窗口函数 之 序号函数 与 sql server 序号函数 一样

sql server 序号函数 序号函数 ROW_NUMBER() 顺序排序RANK() 并列排序&#xff0c;会跳过重复的序号&#xff0c;比如序号为1&#xff0c;1&#xff0c;3DENSE_RANK() 并列排序&#xff0c;不会跳过重复的序号&#xff0c;比如 序号为 1&#xff0c;1&#xff0c;2 语法结构…

ffmpeg,nginx,vlc把rtsp流转hls

ffmpeg:rtsp>hls流; nginx 托管hls流服务; vlc测试hls流服务; 参考了很多相关文档和资料,由于比较乱就不在一一引用介绍了&#xff0c;下面的是实操OK的例子&#xff1b; 1&#xff09;ffmpeg (ffmpeg-4.4.1-full_build)&#xff0c;要用full版本&#xff0c;否则会缺某些…

Python实现企业微信群告警

Python实现企业微信告警 1. 创建企业微信群机器人 1-1. 什么是企业微信群机器人&#xff1f; 企业微信群机器人是企业微信平台提供的一种功能&#xff0c;可以通过Webhook方式将消息发送到指定的企业微信群中。它可以用于自动化发送通知、告警等信息&#xff0c;实现监控和信…

飞天使-k8s基础组件分析-持久化存储

文章目录 emptyDirhostpathpv和pvc介绍nfs作为静态pv案例nfs作为动态pv案例使用本地文件夹作为pv改变默认存储类及回收策略参考文档 emptyDir 重启文件还有&#xff0c;但是如果杀了进程&#xff0c;则会丢失文件 创建pod # kubectl apply –f redis.yaml校验pod是否处于运行&…

数据结构(7)

B树 B树中允许一个节点拥有多个key。设定参数M&#xff0c;构造B树 1.每个结点最多右M-1个key&#xff0c;并且以升序排列 2.每个结点最多右M个子结点 3.根节点至少右两个子结点 通过磁盘预读&#xff0c;将数据放到B树中&#xff0c;3层B树可容纳1024*1024*1024差不多10亿…

CentOS7.9安装Java11

文章目录 Java11版本介绍安装步骤查看并卸载已有版本安装Java11最新版本配置生效 openjdk介绍 Java11版本介绍 Java 11是Java编程语言的一个重要版本&#xff0c;于2018年9月发布Java 11在语言特性、性能优化和安全性方面都有一些显著的改进&#xff0c;为Java开发者提供了更多…

Mongodb 集合插入文档自动生成ObjectId

插入单个文档 Mongodb 使用以下几种方法来插入文档 &#xff0c; Mongodb V5.0 使用 mongosh 客户端&#xff1a; 插入单个文档 db.collection.insertOne() 将单个 文档插入到集合中。 如果该集合当前不存在&#xff0c;则插入操作将创建该集合。 如果文档未指定_id字段&am…

MySQL每日一练--销售管理系统

一&#xff0c;创建数据库SaleSys 二&#xff0c;在数据库SaleSys中创建3张表 品牌信息表&#xff08;brand&#xff09; BrandId --品牌编号&#xff0c;整型&#xff0c;自动增长&#xff0c;主键BrandName --品牌名称&#xff0c;字符型&#xff0c; 唯一约束 商品表…

JavaScript Es6_3笔记

JavaScript 进阶 文章目录 JavaScript 进阶编程思想面向过程面向对象 构造函数原型对象constructor 属性对象原型原型继承原型链 了解构造函数原型对象的语法特征&#xff0c;掌握 JavaScript 中面向对象编程的实现方式&#xff0c;基于面向对象编程思想实现 DOM 操作的封装。 …