读书笔记:深入理解 Oracle 的 DATE 类型:存储、计算与最佳实践

news/2025/10/13 17:05:57/文章来源:https://www.cnblogs.com/www-htz-pw/p/19138882

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

深入理解 Oracle 的 DATE 类型:存储、计算与最佳实践

Oracle 数据库中的 DATE 类型是一种功能强大且高效的日期时间数据类型。它不仅用于存储日期,还精确到秒级时间。本文将深入探讨其内部存储格式、如何进行日期运算,并提供实用的最佳实践建议。

1. DATE 类型的内部存储机制

DATE 是一种固定宽度、占用 7 个字节的数据类型。每个字节分别存储以下七个属性:

  • 字节 1:世纪 (Century)
  • 字节 2:年份 (Year)
  • 字节 3:月份 (Month)
  • 字节 4:日 (Day)
  • 字节 5:小时 (Hour)
  • 字节 6:分钟 (Minute)
  • 字节 7:秒 (Second)

Oracle 使用一种特殊的内部格式存储这些值,并非直接存储我们看到的数字。我们可以使用 DUMP 函数来查看其内部实际存储的值。

示例:查看内部存储

SQL> CREATE TABLE t (x DATE);
SQL> INSERT INTO t (x) VALUES (TO_DATE('25-jun-2005 12:01:00', 'dd-mon-yyyy hh24:mi:ss'));
SQL> SELECT x, DUMP(x, 10) AS d FROM t;X          D
--------- -----------------------------------
25-JUN-05 Typ=12 Len=7: 120,105,6,25,13,2,1

解码存储格式:

  • 世纪和年份 (120,105):采用“excess-100”表示法。计算方式为 字节值 - 100
    • 世纪: 120 - 100 = 20 (20世纪)
    • 年份: 105 - 100 = 5 (05年)
    • 如果结果为负数,则表示公元前(BC)日期。
  • 月份和日期 (6,25):直接存储,无需转换。6 代表六月,25 代表25日。
  • 时间部分 (13,2,1):采用“excess-1”表示法。计算方式为 字节值 - 1
    • 小时: 13 - 1 = 12
    • 分钟: 2 - 1 = 1
    • 秒: 1 - 1 = 0
    • 因此,1,1,1 代表午夜 00:00:00。

这种精巧的存储格式使得日期能够自然地按二进制顺序排序,并且截断操作(如截取到天或月)非常高效,只需将相应字节设置为 1 即可。

2. 给 DATE 类型加减时间

DATE 类型增加或减少时间单位主要有三种方法:

  1. 直接加数字DATE + nn 代表天数,因此 1 是一天,1/24 是一小时,1/24/60 是一分钟,依此类推。
  2. 使用 INTERVAL 数据类型:例如 NUMTODSINTERVAL(n, 'unit') 用于天/秒级单位,NUMTOYMINTERVAL(n, 'unit') 用于年月级单位。
  3. 使用内置函数ADD_MONTHS(date, n) 专门用于增加月份,能智能处理月末日期。

推荐的最佳实践:

  • 秒、分钟、小时:使用 NUMTODSINTERVAL(n, 'second'/'minute'/'hour')。代码更清晰易读。
    SELECT SYSDATE + NUMTODSINTERVAL(1, 'HOUR') FROM dual; -- 加1小时
    
  • 天、周:直接加数字。
    SELECT SYSDATE + 7 FROM dual; -- 加1周
    
  • 月、年强烈推荐使用 ADD_MONTHS(date, n)。它能正确处理月末等特殊情况,避免错误。

为什么不推荐用 INTERVAL 加月/年?
ADD_MONTHS 会对月末日期进行智能舍入,而直接加 INTERVAL 可能导致错误。

-- ADD_MONTHS 能正确处理月末
SELECT ADD_MONTHS(TO_DATE('29-FEB-2000', 'DD-MON-YYYY'), 1) FROM dual;
-- 结果: 31-MAR-2000 (返回下个月的最后一天)-- 使用 INTERVAL 可能出错
SELECT TO_DATE('30-JAN-2001', 'DD-MON-YYYY') + NUMTOYMINTERVAL(1, 'MONTH') FROM dual;
-- 错误: ORA-01839: 日期对指定的月份无效 (因为二月没有30号)

3. 计算两个 DATE 之间的差异

直接相减即可得到两个日期之间相差的天数(包括小数部分)。

SELECT (SYSDATE - hire_date) AS days_diff FROM employees;

要获取更直观的“年-月-日 时:分:秒”格式的差异,可以结合使用函数:

SELECTNUMTOYMINTERVAL(TRUNC(MONTHS_BETWEEN(dt2, dt1)), 'month') AS years_months,NUMTODSINTERVAL(dt2 - ADD_MONTHS(dt1, TRUNC(MONTHS_BETWEEN(dt2, dt1))),'day') AS days_hours
FROM (SELECTTO_DATE('29-feb-2000 01:02:03', 'dd-mon-yyyy hh24:mi:ss') AS dt1,TO_DATE('15-mar-2001 11:22:33', 'dd-mon-yyyy hh24:mi:ss') AS dt2FROM dual
);-- 结果示例:
-- YEARS_MONTHS: +000000001-00 (1年0个月)
-- DAYS_HOURS:   +000000015 10:20:30.000000000 (15天10小时20分30秒)

解释:

  1. MONTHS_BETWEEN(dt2, dt1) 计算两个日期之间总月数(含小数)。
  2. TRUNC(...) 取整,得到完整的月数。
  3. NUMTOYMINTERVAL(...) 将整月数转换为“年-月”间隔。
  4. dt2 - ADD_MONTHS(dt1, 整月数) 计算扣除整月后剩余的时间差。
  5. NUMTODSINTERVAL(...) 将剩余的时间差转换为“天 时:分:秒”间隔。

总结

  • 存储:Oracle DATE 使用 7 字节高效存储,格式精巧,支持自然排序和快速截断。
  • 运算
    • 加/减时间:使用 NUMTODSINTERVAL 处理小时/分钟/秒,直接加数字处理天,使用 ADD_MONTHS 处理月/年。
    • 避免使用 NUMTOYMINTERVAL 直接给日期加月份或年份,以免因月末日期导致错误。
  • 差异:日期相减得天数。组合 MONTHS_BETWEEN, ADD_MONTHS, NUMTOYMINTERVALNUMTODSINTERVAL 函数可以计算出精确的年、月、日、时、分、秒差。

遵循这些最佳实践,您将能更加准确和高效地在 Oracle 中处理日期和时间数据。

------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

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

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

相关文章

一文读懂:C++ STL 学生与竞赛选手都会遇到的容器默认排序的疑惑

C++ STL 学生与竞赛选手都会遇到的疑惑。 下面我们系统讲清楚:🧩 一、结论速览表:STL 常见数据结构默认排序方向容器类型 默认排序方向 底层实现 比较器默认类型 改为从大到小的写法std::set 从小到大(升序) 红黑…

零基础新手的以太坊质押(Staking)终极科普文章

零基础新手的以太坊质押(Staking)终极科普文章。我们将用最生活化的比喻,揭开它神秘的面纱。不再挖矿,变身“数字银行股东”:一文读懂以太坊质押 想象一下,以前的以太坊就像一个巨大的“数字挖矿游戏”,而今天,…

常见应用案例,AI应用开发流程

AI应用开发流程: 1.分析需求; 2.找对应的模型,分析匹配合适的模型; 3.下载模型,跑数据集测试 4.应用 1 文生图模型: 2 图生文: 图片文本识别,提取文本,识别车牌号: 3.识别表单文本 https://github.com/Paddl…

对数据要求高的On-the-fly

必须是有序序列(Sequence is Mandatory) 不支持无序数据集(如 Zip-NeRF 风格或许多 DeepBlending 场景)。 要求图像按顺序捕获,且连续帧之间必须有足够的重叠(理想情况下超过 2/3 的内容)。 严格的运动要求(Tr…

计算机视觉(opencv)——基于 dlib 的实时摄像头人脸检测 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【开题答辩全过程】以 springboot+美食电子商城的设计与实现为例,含有答辩的问题和答案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

程序设计实践训练(Day1) - --YZ-

程序设计实践训练(Day1)Posted on 2025-10-13 16:46 --YZ-- 阅读(0) 评论(0) 收藏 举报程序设计实践训练(Day1) 第一——判断 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+…

vmware部署win7,win2008,win2012等系统如何手动安装vmware tools

vmware部署win7,win2008,win2012等系统如何手动安装vmware toolswin10和win11都能自动安装vmware tools,但win7,win2008和win2012必须手动安装,Windows版的vmware toos镜像名称是windows.iso,路径在VMware Works…

2025 年工业 X 光机厂家最新推荐排行榜:聚焦技术领先与市场认可的优质国内企业选购指南X光检查机/食品X光机/异物检测厂家推荐

引言当前工业制造向高端化、智能化加速转型,X 光机作为核心检测设备,在集成电路、新能源电池、汽车制造等领域的作用愈发关键,是保障产品质量安全的 “工业医生”。但随着市场需求激增,X 光机品牌数量大幅增加,产…

【黑马python】基础 4.Python 循环语句 while for range

笔记汇总目录【黑马python】8天python从入门到精通 - 汇总Python 循环语句代码示例参考链接黑马-4.Python 循环语句 01-while循环的基础应用tbd

ERP不只是财务软件!如何让生产、采购、仓库都用起来?

很多企业上ERP的时候,都是满心期待的。领导层觉得,有了ERP,信息化终于能覆盖全公司,财务、生产、采购、仓库、销售都能打通,数据实时共享,效率大大提升。 可是一年两年过去了,现实情况却常常是这样:财务天天在…

2025 年国内智能炒菜机器人厂家最新推荐排行榜:聚焦餐饮降本增效需求,精选行业优质品牌云端/大师/节能/健康炒菜机器人厂家推荐

当前餐饮行业深陷人力成本高、菜品标准化难、出餐效率低的困境,智慧厨房升级成为破局关键,炒菜机器人市场需求激增。但市面上品牌繁杂,产品质量、功能优势差异大,餐饮企业难辨优劣,选购时易踩坑。为帮助餐饮企业精…

linux 系统指标 简单监控 脚本

#!/bin/bash # 系统监控脚本 - 每日执行版 # 通过crontab每天00:01触发,执行到23:59:59结束 # 使用方法:添加到crontab - 01 00 * * * /root/sys_monitor.sh# 定义日志目录和文件 LOG_DIR="/root/logs/sys_moni…

2025 年最新推荐!国内优质流量计厂家综合实力推荐榜,助力企业精准选购可靠流量测量设备涡街/超声波/液体/气体/工业流量计厂家推荐

引言在工业生产自动化进程中,流量计作为关键的流体流量测量设备,其性能稳定性、数据精准度直接关系到企业生产效率提升、运营成本控制乃至安全生产保障。当前国内流量计市场品牌繁杂,既有深耕行业多年的老牌企业,也…

宝塔项目配置CDN

核心思路 配置CDN的核心流程可以简单概括为:​​源站(你的服务器)不变 -> 域名解析指向CDN提供商 -> CDN回源到你的服务器​​ 第一步:准备工作​​一个可正常访问的网站​​:确保你的网站在宝塔面板上已经…

59. 螺旋矩阵 II 模拟过程

59. 螺旋矩阵 II 思路 用代码模拟出顺时针填充数字的过程。 每填充一圈涉及4条边:顶部、右列、底部、左列。对每条边的处理保持一致,每条边均采用左闭右开统一处理,避免出现混乱,即循环不变量原则。 不变量:坚持相…

2025 年漆包线制造厂最新推荐排行榜:极细合金 / 自粘铜包铝 / 医疗消融合金等多类型线材企业精选,助力采购商精准挑选优质品牌

引言 当前漆包线行业产能过剩问题突出,供需失衡加剧市场 “内卷”,漆包圆线领域企业扎堆、产品同质化严重,企业常以延长账期、降低加工费等方式竞争,导致行业陷入低水平循环。采购商在众多品牌中难辨优劣,亟需一份…

你真的会在SQL Plus中设置行宽吗?

你真的会在SQL Plus中设置行宽吗?2025-10-13 16:38 潇湘隐者 阅读(0) 评论(0) 收藏 举报在使用SQL Plus命令行时,经常会要设置行宽(linesize),展示的格式才能美观一些.但是你真的对行宽设置都理解透彻了吗? SET …

秒杀系统的架构(Golang 实现) - Lafite

秒杀系统的架构(Golang 实现) 12306抢票,极限并发带来的思考? 每到节假日期间,一二线城市返乡、外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家…

2025 年 NMN 怎么选?Japan KSKN,抗衰领域的实力之选

随着人们生活水平的提高,对健康和抗衰老的关注度日益提升。NMN 作为一种热门的抗衰成分,逐渐走进大众视野。在众多 NMN 品牌中,Japan KSKN(日本康诺)以其独特的优势脱颖而出。一、Japan KSKN 核心实力,公司概况与…