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等语句中使用。今天了解到的函数在处理数据库中的字符串数据时非常有用,特别是当需要转换、去除、清理或格式化数据时。具体是如何使用,都要考虑使用场景以及性能方面的问题,后续会再出一些相关的博文。


[引用参考]

  1. https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Functions.html#GUID-D079EFD3-C683-441F-977E-2C9503089982

欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。

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

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

相关文章

五分钟”手撕“异常

目录 一、什么是异常 二、异常的体系和分类 三、异常的处理 1.抛出异常 2.异常的捕获 异常声明throws: try-catch处理 四、finally finally一定会被执行吗? 五、throw和throws区别 六、异常处理的流程 七、自定义异常 一、什么是异常 顾名…

大模型额外篇章二:基于chalm3或Llama2-7b训练酒店助手模型

文章目录 一、代码部分讲解二、实际部署步骤(CHALM3训练步骤)1)注册AutoDL官网实名认证2)花费额度挑选GPU3)准备实验环境4)开始执行脚本5)从浏览器访问6)可以开始提问7)开始微调模型8)测试训练后的模型三、基于Llama2-7b的训练四、额外补充1)修改参数后2)如果需要访问…

PHP:open_basedir restriction in effect.

当我们下载了组件,引入的时候出现 open_basedir restriction in effect,那这个时候我们该怎么弄呢? 首先我们进入宝塔管理页面:【软件商店】-【运行环境】-【安装PHP】-【设置】 其中后面的路径是用 : 来分隔表示多少个&#xff…

指纹识别系统架构

目录 1. 系统架构 1.1 指纹采集模块 1.2 指纹处理模块 1.3 指纹登记模块 1.4 指纹识别模块 1.5 指纹识别决策模块 1.6 管理模块 1.6.1 存储管理 1.6.2 传输管理 1.6.3 安全管理 1.7 应用开放功能 1.7.1 指纹登记功能 1.7.2 指纹验证功能 1.7.3 指纹辨识功能 2. …

Android Studio制作简单登录界面

Android Studio制作简单登录界面 实现目标 应用线性布局设计登录界面,要求点击输入学号时弹出数字键盘界面,点击输入密码时弹出字母键盘,出现的文字、数字、尺寸等全部在values文件夹下相应.xml文件中设置好,使用时直接引用。当…

蓝桥杯物联网竞赛_STM32L071KBU6_关于size of函数产生的BUG

首先现象是我在用LORA发送信息的时候,左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了,又或者是我想搞创新用了const char* 类型强制转换数据的原因,结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…

【云原生】Kubernetes基础命令合集

目录 引言 一、命令概述 (一)命令分类 (二)基本语法 二、查看基本信息 (一)环境指令 1.查看版本信息 2.查看资源对象简写 3.添加补全信息 4.查看日志 5.查看集群信息 (二&#xff0…

数据结构(三)

数据结构(三) 图状关系顺序存储链式存储十字链表法多重链表法 图的遍历佛洛依德算法迪杰斯特拉算法洪水算法 图状关系 按有无方向分:有向图、无向图 按是否有权值:带权图、不带权图 顺序存储 链式存储 十字链表法 多重链表法 图…

【笔记】软件架构师要点记录(2)

【笔记】软件架构师要点记录 20240523案例一案例二案例三案例四案例五案例六案例七案例十 20240523 基于前10个架构案例场景,对用到的专业术语进行整理,方便后续查看。 案例一 MVC架构风格组件交互方式 MVC是一种用来构建用户界面时采用的架构设计风格…

攻防世界[GoodRe]

攻防世界[GoodRe] 学到知识: 逆向的精髓:三分懂,七分蒙。TEA 算法快速识别(蒙): 数据处理的形式:进入加密时的数据和加密结束后的数据,处理时数据的分组等等,都能用来…

使用libtorch加载YOLOv8生成的torchscript文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集,使用 LabelMe 工具进行标注,然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件,并自动生成YOLOv8支持的目录结构,包括melon.yaml文件,其内容…

VMware虚拟机如何与主机共享文件夹

本机:WIN10 VMware虚拟机:WIN7 因为每次配置都爱忘记操作,目标是为了在WIN7虚拟机中可以访问本机文件 首先本机操作 新建一个共享文件夹,不带中文目录(最好不要) 点击共享 选择everyone,记得权限"读取和写入" 然后到虚拟机里面 添加一个网络位置 点击浏览,选择网…

第一节:Redis的数据类型和基本操作

最近整理了关于Redis的一些文档,分享给大家,后续会持续更新...... Redis的数据类型 字符串String String:字符串,可以存储String、Integer、Float型的数据,甚至是二进制数据,一个字符串最大容量是512M 列表…

IS-IS DIS

原理概述 OSPF 协议支持4种网络类型, IS-IS 协议只支持两种网络类型,即广播网络和点到点网络。与 OSPF 协议相同, IS-IS 协议在广播网络中会将网络视为一个伪节点( Pseudonode ,简称 PSN ),并选举出一台 DIS ( Designa…

ISCC2024个人挑战赛WP-WEB

(非官方解,以下内容均互联网收集的信息和个人思路,仅供学习参考) 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…

springcloud多个服务共用同一个nacos配置

spring:profiles:active: devcloud:nacos:config:server-addr: 172.168.1.xx:8848enabled: truefile-extension: yamlnamespace: public#按需引入nacos中的配置#shared-configs: database.yamlextension-configs:# 数据源配置- data-id: database.yamlgroup: DEFAULT_GROUP# re…

系统思考—问题分析与持续改进

刚刚为一家500强企业完成了《系统思考—问题分析与持续改进》的课程。学员们开始意识到,不能仅仅停留在冰山上层事件去解决问题,而是要深入观察隐藏在背后的趋势变化。学会如何识别系统中的深层次原因,并从全局视角来制定更加有效的改进策略。…

电子电器架构 - 车载网管功能简介

电子电器架构 - 车载网管功能简介 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,…

Windows下安装配置深度学习环境

Windows下安装配置深度学习环境 1. 准备工作 1.1 环境准备 操作系统:win10 22H2 GPU:Nvidia GeForce RTX 3060 12G 1.2 安装Nvidia驱动、cuda、cuDNN 下载驱动需要注册并登录英伟达账号。我这里将下面用到的安装包放到了百度网盘,可以关注微信…

DFA 算法

为什么要学习这个算法 前一段时间遇到了瓶颈,因为词库太多了导致会有一些速度过慢,而且一个正则表达式已经放不下了,需要进行拆分正则才可以。 正好我以前看过有关 dfa 的介绍,但是并没有深入的进行研究,所以就趁着周…