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=
相关文章:
Oracle 时区详解
1 简介 由于地球经纬度及地球自转引起的经度方向,不同的经度的地方,所感受到的昼夜是不同 的。有关国际会议决定将地球表面按经线从东到西,每隔经度15度划分一个时区,并且规定 相邻区域的时间相差1小时。 这就是时区的由来。 而实际使用中,…...

仿mudou高性能高并发服务器
"这个结局是我的期待,我会一直为你祝福。" 项目实现目标: 仿muduo库One Thread One Loop式主从Reacto模型实现高并发服务器。通过实现高并发服务器组件,简洁快速完成搭建一个高性能服务器。并且,通过组件内提供的不同应⽤层协议⽀…...
vue权限管理——菜单权限设置
1.前提:后端提供菜单对应数据 此处用mockjs模拟 const menuList [{id: 1, path:/uploadSpec,authName: "上传spec", icon: User, children:[], rights:[view,add,edit,delete]},{id: 2, path:/showSpec, authName: "Spec预览", icon: DataAn…...
【LeetCode】228.汇总区间
题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b]…...

Qt快速学习(二)--QMainWindow,对话框,布局管理器,常用控件
目录 1 QMainWindow 1.1 菜单栏 1.2 工具栏 1.3 状态栏 1.4 铆接部件 1.5 核心部件(中心部件) 1.6 资源文件 2 对话框QDialog 2.1 基本概念 2.2 标准对话框 2.3 自定义消息框 2.4 消息对话框 2.5 标准文件对话框 3 布局管理器 3.1 系统…...
群晖DSM下套件及系统网页服务器ssl证书自动更新
关键字: DSM ssl 证书 起因 群晖下自建服务(alist3)和系统服务在外部网络访问需要加ssl安全证书来实现基础的传输保护。 申请证书和续期手动操作都还好,不算太麻烦,但是每个应用单独证书需要复制和重启,再配合服务重启一套下来就…...

【Flink】Flink架构及组件
我们学习大数据知识的时候,需要知道大数据组件如何安装以及架构组件,这将帮助我们更好的了解大数据组件 对于大数据Flink,架构图图下: 整个架构图有三种关键组件 1、Client:负责作业的提交。调用程序的 main 方法&am…...
React Navigation 开发准备
需要 React Native 使用 React Navigation 的话,我们需要首先安装如下几个包: npm install react-navigation/native npm install react-native-screens react-native-safe-area-context开发之前做一些处理 如果您使用的是 Mac 并针对 iOS 进行开发&am…...
前端面试:【前端安全】安全性问题与防范措施
嗨,亲爱的前端开发者!在构建Web应用程序时,确保安全性是至关重要的。本文将深入讨论前端开发中的安全性问题,并提供一些防范措施,以确保你的应用程序和用户数据的安全性。 前端安全性问题: 跨站脚本攻击&am…...

[Linux]进程
文章目录 1. 进程控制1.1 进程概述1.1.1 并行和并发1.1.2 PCB1.1.4 进程状态1.1.5 进程命令 1.2 进程创建1.2.1 函数1.2.2 fork() 剖析 1.3 父子进程1.3.1 进程执行位置1.3.2 循环创建子进程1.3.3 终端显示问题1.3.4 进程数数 1.4 execl和execlp函数1.4.1 execl()1.4.2 execlp(…...
01-jupyter notebook的使用方法
一、Tab补全 在shell中输入表达式,按下Tab,会搜索已输入变量(对象、函数等等)的命名空间: 除了补全命名、对象和模块属性,Tab还可以补全其它的。当输入看似文件路径时 (即使是Python字符串&…...

pytestx容器化执行引擎
系统架构 前端、后端、pytest均以Docker容器运行服务,单独的容器化执行引擎,项目环境隔离,即用即取,用完即齐,简单,高效。 前端容器:页面交互,请求后端,展示HTML报告 后…...

(动态规划) 剑指 Offer 42. 连续子数组的最大和 ——【Leetcode每日一题】
❓ 剑指 Offer 42. 连续子数组的最大和 难度:简单 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为 O(n)。 示例1: 输入: nums [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1…...

OLED透明屏曲面技术:创新突破引领显示行业未来
OLED透明屏曲面技术作为一项重要的显示技术创新,正在成为显示行业的焦点,其引人注目的优势和广泛应用领域使其备受关注。 本文将详细介绍OLED透明屏曲面技术的优势、应用领域以及市场前景,同时展望其未来的发展趋势,以期带给读者…...

视频云存储/安防监控EasyCVR视频汇聚平台分发rtsp流时,出现“用户已过期”提示该如何解决?
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…...

调用paddleocr接口实现文本检测与识别,并在图像中显示识别结果
目录 一、按照官网步骤安装paddlepaddle和paddleocr(paddlepaddle我安装的是cpu版本) 二、运行下面的脚本 三、图像结果 一、按照官网步骤安装paddlepaddle和paddleocr(paddlepaddle我安装的是cpu版本) doc/doc_ch/quickstart.md PaddlePaddle/PaddleOCR - Gitee.com 二、…...
如何提升winform程序性能
提升WinForms程序性能是一个关键的优化任务,以下是一些可以帮助你提升性能的方法: 1. **UI延迟加载:** 如果你的WinForms界面很复杂,可以考虑将不必要的UI元素延迟加载,只在需要时加载,以减少启动时间和内…...

按钮权限控制
搜索关键字: 自定义指令传参| "自定义指令""dataset"|自定义指令dataset| "Vue""directives"|vue按钮权限实现 1、完整代码: <template> <div> <el-breadcrumb separator-class"el-icon…...
【脚本式设置环境变量】
在linux系统中,如果我打开一个软件需要如下操作,那将会是一件很麻烦的事情 cd dir #软件的文件路径 conda deactivate conda activate chatgpt python main.py【首先写一个chatgpt.sh脚本内容如下】 #!/bin/bash cd dir conda run -n chatgpt python m…...

软件开发bug问题跟踪与管理
一、Redmine 项目管理和缺陷跟踪工具 官网:https://www.redmine.org/ Redmine 是一个开源的、基于 Web 的项目管理和缺陷跟踪工具。它用日历和甘特图辅助项目及进度可视化显示,同时它又支持多项目管理。Redmine 是一个自由开源软件解决方案,…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...