Oracle实践|内置函数之日期与时间函数

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~
文章目录
- 序言
- 背景说明
- 示例环境
- 1 常用日期/时间函数
- 2 日期/时间格式化/解析类函数
- TO_CHAR函数
- TO_DATE函数
- TO_TIMESTAMP函数
- 3 日期运算类函数
- ADD_MONTHS函数
- LAST_DAY函数
- NEXT_DAY函数
- MONTHS_BETWEEN函数
- 4 提取特定日期/时间函数
- 5 日期函数加/减法
- 总结
序言
背景说明
Oracle 数据库提供了丰富的内置函数,涵盖数值处理、字符串操作、日期和时间处理、逻辑判断、集合处理、数据分析、数据类型转换等多个方面。下面就随着我一起来学习下这个内置函数吧,有解释不到之处,还望批评指正。
Oracle 数据库提供了一系列强大的日期与时间函数,用于处理和操作日期和时间。在处理过程中,日期和时间是分不开的内置函数,两者结合其他函数处理日期和时间相关的查询、计算、格式化,为我们在工作、学习提供了便利。

示例环境
本篇示例是基于Oracle DB 19c EE (19.17.0.0.0)版本操作,所操作的环境依旧是oracle提供的在线测试环境。如果有不同之处,请指出。

1 常用日期/时间函数
【定义】
SYSDATE:返回服务器当前的日期和时间(是否包含时间取决于使用场景和其他函数)。这个值是由数据库服务器的系统时钟确定的,每次查询时都会实时获取。默认返回格式DD-MM-YY。
CURRENT_DATE:返回当前日期(不含时间部分)。返回格式DD-MM-YY,类似SYSDATE。
CURRENT_TIMESTAMP:返回当前日期和时间,包括时区信息。返回格式DD-MM-YY HH24:MI:SS.FF。
LOCALTIMESTAMP:返回当前日期和时间,不包括时区信息。返回格式DD-MM-YY HH24:MI:SS.FF。
【示例】
获取当前日期(没有其他函数,不做任何修饰的返回)
select SYSDATE,TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss') AS "Now",CURRENT_DATE,CURRENT_TIMESTAMP,LOCALTIMESTAMP
from dual;

例如我们在物理设计模型中没有设计这些函数,可以在代码中使用这些命令返回当前的日期/时间来作为业务的时间点或者可以作为数据的默认时间。关于格式(format models)的定义可以参考:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Format-Models.html#GUID-E118F121-A0E1-4784-A685-D35CE64B4557
2 日期/时间格式化/解析类函数
上面也讲过,对于日期函数,我们多数都是在解析中或者转换中,以符合我们的业务展示需求。下面就是日期时间函数的格式化和转换过程。
TO_CHAR函数
【定义】
● TO_CHAR(bfile|blob)
● TO_CHAR(character)
● TO_CHAR(datetime)
● TO_CHAR(number)
对于TO_CHAR函数来说,转换日期时间函数有日期时间和数字,本章节只说明针对日期时间函数,可以有的格式有
TO_CHAR(date, format_model): 将日期/时间转换为字符串(简称DT转S),转换过程中主要取决于format_model。
select TO_CHAR(SYSDATE, 'yyyy-mm-dd') AS "Now1", -- 默认获取到年月日TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss') AS "Now2", -- 默认获取到年月日 时分秒TO_CHAR(SYSDATE, 'month') AS "Now3", -- 格式还可以使用英文单词,例如month,返回april(不区分大小写,但是需要写对)TO_CHAR(SYSDATE, 'YEAR') AS "Now3" -- 格式还可以使用英文单词,例如YEAR,返回TWENTY TWENTY-FOUR(不区分大小写,但是需要写对)
from dual;

TO_DATE函数
TO_DATE(string, format_model): 将字符串转换为日期/时间(简称S转DT),转换过程中主要取决于format_model。
select TO_DATE('2024-04-29', 'yyyy-mm-dd') AS "DT1",--TO_DATE('2024-04-29 08:08:08', 'yyyy-mm-dd') AS "DT2",TO_DATE('2024-04-29', 'yyyy-mm-dd hh24:mi:ss') AS "DT3",TO_DATE('2024-04-29 01:02:03', 'yyyy-mm-dd hh:mi:ss') AS "DT4"
from dual;

注意⚠️
此函数时转为日期,多余的会舍弃掉。
当我们使用转换函数时,可以由小转大,例如DT3;
但是不能使用小转到,接收不了,例如DT2,此时会报错:ORA-01830: date format picture ends before converting entire input string
TO_TIMESTAMP函数
【定义格式】
TO_TIMESTAMP(string1 [, format_model] [[, nls_language]]):将字符串转换为带时区的时间戳,转换过程中主要取决于format_model。
- string1:要转换的原始字符串,包含日期和时间信息。
- format_model(可选):定义字符串中日期和时间元素的格式模型。如果省略,Oracle会尝试使用默认的日期格式进行解析,但这可能导致错误,特别是当字符串格式与数据库的默认格式不匹配时。
- nls_language(可选):用于控制日期时间元素的翻译,比如月份和星期的名称。如果省略,将使用会话的当前语言设置。
【示例】
select TO_TIMESTAMP('2024-04-29', 'yyyy-mm-dd') AS "DT1",--TO_TIMESTAMP('2024-04-29 08:08:08', 'yyyy-mm-dd') AS "DT2",TO_TIMESTAMP('2024-04-29', 'yyyy-mm-dd hh24:mi:ss') AS "DT3",TO_TIMESTAMP('2024-04-29 01:02:03', 'yyyy-mm-dd hh:mi:ss') AS "DT4"
from dual;

注意⚠️
此函数时转为时间,不足的会补充。其中包含时区信息(TO_TIMESTAMP_TZ)的很少使用,这里不在赘述。
当我们使用转换函数时,即使我们写了日期格式,也会补充时间格式,例如DT1;
当我们使用转换函数时,使用的格式不足支撑数据则会报错,例如DT2;
当我们使用转换函数时,使用的数据值不满足格式时,会补充时间格式,例如DT3;
当我们使用转换函数时,正常情况下例如DT4;
3 日期运算类函数
这里函数在SQL计算中很常见,例如查询3个月以前的数据,查询上周的数据等等。下面就是一些常用的函数ADD_MONTHS、LAST_DAY、NEXT_DAY、MONTHS_BETWEEN。
ADD_MONTHS函数
【定义】
ADD_MONTHS(date, months): 加减指定月份数。
【示例】
在当前月份加上3个月或者减去4个月后的的日期值。
select SYSDATE, -- 当前日期:2024-04-29ADD_MONTHS(SYSDATE, 3), -- 当前日期加上3个月后:2024-07ADD_MONTHS(SYSDATE, -4) -- 当前日期减去4个月后:2023-12
from dual;

LAST_DAY函数
常用于具体的算法,例如想要获取指定日期所在月份的最后一天。
LAST_DAY(date): 返回指定日期所在月份的最后一天。
select SYSDATE,LAST_DAY(SYSDATE)
from dual;

NEXT_DAY函数
【定义】
NEXT_DAY(date, day_of_week): 返回指定日期后下一个指定星期几的日期,返回值为日期。
【示例】
select SYSDATE, -- 今天2024-04-29,周一NEXT_DAY(SYSDATE, 1), -- 返回下一个星期天,也就是2024-05-05周日(星期日 = 1 星期一 = 2 星期二 = 3 星期三 = 4 星期四 = 5 星期五 = 6 星期六 = 7)NEXT_DAY(SYSDATE, 6), -- 返回下一个星期五,也就是2024-05-03周五(星期日 = 1 星期一 = 2 星期二 = 3 星期三 = 4 星期四 = 5 星期五 = 6 星期六 = 7)NEXT_DAY(SYSDATE, 'FRIDAY')
from dual;

其中,day_of_week的值从星期天开始,也可以使用英文单词(FRIDAY),如下
星期日 = 1 星期一 = 2 星期二 = 3 星期三 = 4 星期四 = 5 星期五 = 6 星期六 = 7
MONTHS_BETWEEN函数
个人认为这个函数使用的频率不是很高,使用比较高的场景应该是计算两个日期之间的天数,可惜没有类似功能的函数,不过还比较好,可以使用日期的加减法来计算,后续会有这块内容讲述。
【定义】
MONTHS_BETWEEN(date1, date2[, round_mode]): 计算两个日期之间的月数。
【描述】
MONTHS_BETWEEN返回日期date1和date2之间的月数。月份和月份的最后一天由参数NLS_CALENDAR定义。
如果date1晚于date2,则结果为正。
如果date1早于date2,则结果为负。
如果date1和date2是一个月中的同一天或两个月的最后几天,则结果始终为整数。否则,Oracle数据库根据31天的月份计算结果的小数部分,并考虑时间分量date1和date2的差异。
【示例】
见名识义,例如我想获取2023-11-26 到 2024-04-29 之间的月份。

4 提取特定日期/时间函数
提取函数同截取函数差不多,都是获取到业务需要的部分,然后进入到其他计算范畴。
【定义】
EXTRACT(component FROM datetime): 提取日期/时间的特定部分(如YEAR、MONTH、DAY等)。
【示意图】

【示例】
我想获取2024-04-29中的各个数据,则可以使用下面的方式
select SYSDATE, EXTRACT(year FROM TO_TIMESTAMP('2024-04-29 01:02:03', 'yyyy-mm-dd hh:mi:ss')) "Year",EXTRACT(month FROM TO_TIMESTAMP('2024-04-29 01:02:03', 'yyyy-mm-dd hh:mi:ss')) "Month",EXTRACT(day FROM TO_TIMESTAMP('2024-04-29 01:02:03', 'yyyy-mm-dd hh:mi:ss')) "Day",EXTRACT(hour FROM TO_TIMESTAMP('2024-04-29 01:02:03', 'yyyy-mm-dd hh:mi:ss')) "Hour",EXTRACT(minute FROM TO_TIMESTAMP('2024-04-29 01:02:03', 'yyyy-mm-dd hh:mi:ss')) "Minute",EXTRACT(second FROM TO_TIMESTAMP('2024-04-29 01:02:03', 'yyyy-mm-dd hh:mi:ss')) "Second"
from dual;

5 日期函数加/减法
日期函数还可以进行加减法运算,话不多说,直接贴代码。例如我想返回当前日期加上2天后的日期,想返回当前日期减去3天后的日期。
select sysdate, -- 当前日期SYSDATE, -- 当前日期-- 当前日期加上2天sysdate+2,-- 当前日期加上3天sysdate-3
from dual;

总结
本篇主要学习日期和时间相关的内置函数,在我们使用过程中有任何问题都可以在站内联系我。有些内置函数可以在SELECT语句中用于处理数据,同时也可以在WHERE等语句中使用。今天了解到的函数在处理数据库中的字符串数据时非常有用,特别是当需要转换、去除、清理或格式化数据时。具体是如何使用,都要考虑使用场景以及性能方面的问题,后续会再出一些相关的博文。
[引用参考]
- https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Functions.html#GUID-D079EFD3-C683-441F-977E-2C9503089982
欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。
相关文章:
Oracle实践|内置函数之日期与时间函数
📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师 🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 🔥 三连支持:欢迎 ❤️关注…...
内网穿透工具
在渗透过程中,我们需要快速实现内网穿透,从而绕过网络访问限制,直接从外网来访问内网。今天,我们来推荐几款非常好用的内网穿透工具,如有其它推荐,欢迎补充和指正。 1、ngrok ngrok 是一个反向代理&#…...
JAVA自制小游戏之推箱子
给家里孩子实现益智游戏开发,教会他怎么使用编程。以下是一个简单的推箱子游戏的Java实现,包含两个关卡: 这个程序包含两个关卡,每个关卡都是一个字符串表示的地图。游戏会提示玩家输入移动方向(WASD),然后根据输入的方向移动玩家。如果玩家成功将所有的箱子推到目标位…...
Media Encoder 2024 for Mac媒体编码器安装教程ME2024安装包下载
安装 步骤 1,双击打开下载好的安装包。 2,选择install ame_24...双击打开启动安装程序。 3,点击install。 4,输入电脑密码。 5,软件安装中... 6,安装结束点击好。 7,返回打开的镜像 选择激活补…...
B2120 单词的长度
单词的长度 题目描述 输入一行单词序列,相邻单词之间由 1 1 1 个或多个空格间隔,请对应地计算各个单词的长度。 注意:如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。没…...
分布式事务解决方案(最终一致性【可靠消息解决方案】)
可靠消息最终一致性解决方案 可靠消息最终一致性分布式事务解决方案指的是事务的发起方执行完本地事务之后,发出一条消息,事务的参与方,也就是消息的消费者一定能够接收到这条消息并且处理完成,这个方案强调的是只要事务发起方将消…...
AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月28日预测第4弹
昨天的第二套方案已命中,第一套方案由于杀了对子,导致最终出错。 今天继续基于8883的大底,使用尽可能少的条件进行缩号,同时,同样准备两套方案,一套是我自己的条件进行缩号,另外一套是8883的大底…...
JAVA:深入了解JAVA中的23种设计模式(三)- 行为型模式(下)
一、前言 在前三篇 《深入了解JAVA中的23种设计模式(一)- 创建型模式》 《深入了解JAVA中的23种设计模式(二)- 结构型模式》 《深入了解JAVA中的23种设计模式(三)- 行为型模式(上)》…...
微信小程序【WXML】
wxml wei xin markup language 类似于html 文档 数据绑定 小程序中使用{{}} 来进行数据绑定到模板中,如: wxml中的动态数据全部来自js中的data 简单绑定 //wxml <view> {{text }}</view>// index.js Page({data: {text: hello world}, })属性绑定…...
基于python实现的深度学习的车牌识别系统
基于python实现的深度学习的车牌识别系统 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat、Maven 系统功能实现 登录页面 在车牌识别系统当中肯定是有登录的。怎么说呢,登录页面其实还是和最初的设…...
SQL试题使得每个学生 按照姓名的字⺟顺序依次排列 在对应的⼤洲下⾯
学⽣地理信息报告 学校有来⾃亚洲、欧洲和美洲的学⽣。 表countries 数据如下: namecontinentJaneAmericaPascalEuropeXiAsiaJackAmerica 1、编写解决⽅案实现对⼤洲(continent)列的 透视表 操作,使得每个学生 按照姓名的字⺟顺…...
kafka3.6.1版本学习
kafka目录结构 bin linux系统下可执行脚本文件 bin/windows windows系统下可执行脚本文件 config 配置文件 libs 依赖类库 licenses 许可信息 site-docs 文档 logs 服务日志 启动ZooKeeper 进入Kafka解压缩文件夹的config目录,修改zookeeper.properties配置文件 #t…...
移除链表元素-力扣
题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2: 输入&…...
HTTP请求拦截器链
文章目录 HTTP请求拦截器链需求定义写一个Controller方法接口写三个http请求拦截器把拦截器加入到配置中,并且配置拦截规则在postman里面发送请求,看下测试结果是否正确 HTTP请求拦截器链 需求定义 我们写一个包含三个HTTP请求拦截器的拦截器链&#x…...
再创佳绩丨达梦数据库一体机荣获2024数字中国创新大赛·信创赛道总决赛一等奖
5月24日,第七届数字中国建设峰会在福州盛大开幕,峰会内容安排包含开幕式、主论坛、分论坛、数字中国创新大赛、现场体验区及成果发布和专业工作会议等。武汉达梦数据库股份有限公司(以下简称达梦数据)受邀参加并在展、会、赛等多个环节深度参与。达梦全栈…...
数据分析之统计学基础
数据分析是现代企业和科研中不可或缺的一部分,而统计学是数据分析的基石。在本篇博客中,我们将介绍统计学的基础知识,涵盖数据类型、描述性统计(集中趋势、离散程度和偏差程度),并通过代码实例加以说明。 …...
Web3 游戏周报(5.19 - 5.25)
【5.19 - 5.25】Web3 游戏行业动态: Arbitrum 已开启 “2 亿枚 ARB 游戏催化剂计划”的提案投票。 STEPN 在官方 X 宣布将推出全新社交健身应用 STEPN GO。 Oasys 正式推出《足球小将》漫改 Web3 游戏《Captain Tsubasa-RIVALS-》。 Gala Games :已销…...
通过el-tree自定义渲染网页版工作目录,实现鼠标悬浮显示完整名称、用icon区分文件和文件夹等需求
目录 一、通过el-tree自定义渲染网页版工作目录 1.1、需求介绍 1.2、使用el-tree生成文档目录 1.2.1、官方基础用法 ①效果 ②代码: 1.2.2、自定义文档目录(实现鼠标悬浮显示完整名称、用icon区分文件和文件夹) ①效果(直接效…...
C语言 | Leetcode C语言题解之第101题对称二叉树
题目: 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSymmetric(struct TreeNode* root) {if (root NULL) return true;//如果根为空直接…...
TTime:截图翻译/OCR
日常网页翻译Translate Web Pages完全足够,TTime最重要的功能,还是截图翻译,还有个厉害的功能,就是静默OCR,相比之前的分享的识字精灵效率更高。 软件使用 打开软件,点击翻译源设置,建议勾选一…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
