ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle基础(六):日期类型和日期函数

2022-06-08 06:31:26  阅读:235  来源: 互联网

标签:函数 -- DD MM 日期 dual Oracle select


一、日期类型

1、DATE类型:在数据库中存储固定为7个字节,每个字节分别表示:世纪、年、月、日、时、分、秒
2、TIMESTAMP时间戳类型:与DATE类型的区别是不仅可以保存日期和时间,还能保存小数秒,最高精度可以到纳秒(ns),在数据库中存储7或11个字节,前面7个字节与DATE相同。
两个常用内置函数:
(1)SYSDATE:对应数据库一个内置函数,该函数返回一个DATE类型的当前系统时间
(2)SYSTIMESTAMP:返回一个SYSTIMESTAMP时间戳类型的当前系统时间,精确到毫秒。

select sysdate,systimestamp from dual;

二、日期转换函数:TO_DATE(char[,format[,nlsparams]])

可以将给定字符串按照指定的日期格式转换为DATE类型值。参数说明:

  char:要转换字符串

  format:格式

  nlsparams:指定日期的语言

常见的日期格式:

YY 2位数字的年份
YYYY 4位数字的年份
MM 2位数字的月份
MON 简拼的月份(即月份的英文缩写,中文环境为'x月',不常用)
MONTH 全拼的月份(即月份的英文,中文环境为'x月',不常用)
DD 2位数字的天 
DY 周几的缩写(不常用)
DAY 周几的全拼(不常用)
HH24 24小时制的小时
HH12 12小时制的小时
MI 显示分钟
SS 显示秒

 

 

 

 

 

 

 

 

 

 

 

 

 

--将给定字符串按照指定的日期格式转换为DATE类型值。
select to_date('2008-08-08 08:08:08','YYYY-MM-DD HH24:MI:SS') from dual;--默认不显示时分秒

--注意:在日期格式字符串中但凡不是英文,符号的其他字符都需要使用双引号括起来
select to_date('2005年08月01日 12时30分29秒','YYYY"年"MM"月"DD"日" HH24"时"MI"分"SS"秒"') from dual;

三、日期类型的计算

日期可以与一个数字进行加减法,这相当于加减指定的天数。
两个日期可以进行减法,差为相差的天数。(返回值为天数)

--查询每个员工入职至今多少天了(截取到整数位)
select ename,trunc(sysdate-hiredate,0) from emp;

--输入自己的生日,查看距今位置活了多少天(截取到整数位)   1996-08-16
select '出生至今已经'||trunc(sysdate-to_date('1996-08-16','YYYY-MM-DD'),0)||'天' from dual;

四、TO_CHAR(date[,fmt[,nlsparams]])

可以将DATE类型按照给定的日期格式转换为字符串类型

select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

select to_char(sysdate,'YYYY"年"MM"月"DD"日" HH24"时"MI"分"SS"秒"') from dual;

五、 TO_DATE和TO_CHAR使用上的一些问题

SYSDATE默认显示格式为:DD-MON-RRYY格式是2位数的年份,不关注世纪,而RR关注世纪。

RR:当把一个字符串日期以RR的形式转换为DATE的时候,RR是自动决定世纪的,而YY是不决定的。

 

 

--返回2098-07-12,使用YY解析时按系统时间的世纪
select to_char(to_date('98-07-12','YY-MM-DD'),'YYYY-MM-DD') from dual;

--返回1998-07-12,使用RR解析时参照系统时间和给定时间计算出是哪个世纪
select to_char(to_date('98-07-12','RR-MM-DD'),'YYYY-MM-DD') from dual;

 

六、LAST_DAY(date)

返回给定日期date所在月的最后一天(返回一个DATE)

select last_day(sysdate) from dual;
select to_char(last_day(sysdate),'YYYY-MM-DD') from dual;

七、ADD_MONTHS(date,i)

对指定date日期加上指定i月,若i为负数,则是减去指定的月数,返回DATE

select add_months(sysdate,1) from dual;

--查看每个员工入职20周年纪念日
select ename,to_char(hiredate,'YYYY-MM-DD'),to_char(add_months(hiredate,12*20),'YYYY-MM-DD') from emp;

--查看每个员工的转正日期(入职3个月后转正)?
select ename,to_char(hiredate,'YYYY-MM-DD'),to_char(add_months(hiredate,3),'YYYY-MM-DD') from emp;

八、MONTHS_BETWEEN(date1,date2)

返回计算两个指定日期之间相差的月,实际运算是date1-date2,如果date2比date1晚会得到负值,

除非两个日期间隔是整数月,否则将会得到带小数位的结果

(日期DATE直接计算加减结果是天数,如果计算月数则使用该函数)

--查看每个员工入职至今多少个月?
select ename,months_between(sysdate,hiredate) from emp;

九、NEXT_DAY(date,char)

返回给定date日期数据的下一周几,周几由参数char来决定的(也可以传入数字),

在中文环境下,直接使用”星期三”这种形式,英文环境下,需要使用”WEDNESDAY"这种英文的周几。

为避免麻烦,可以直接用数字1-7表示周日~周六。

 

返回给定日期第二天开始一周内确定周几的日期(从明天开始算)
返回给定日期之后的一周内的星期几的日期
char可以是1-7,分别表示:周日,周一...周六

--查询下周三是几号(如果当前日期还没到周三,那就是这周三的日期。如果今天是周三,那就返回下周三的日期)
select next_day(sysdate,4) from dual;
select next_day(sysdate,'星期三') from dual;

--下周日是几号?
select next_day(sysdate,'星期日') from dual;

十、LEAST(expr1[,expr2[,expr3]]...)和GREATEST(expr1[,expr2[,expr3]]...)

求小值与最大值,比较函数,是变长参数,即:可以有多个参数值,返回结果是参数列表中最大或最小的值,参数的类型必须一致。

(注:该函数除了日期可以使用以外,凡是可以比较大小的都可以使用)

对于日期而言,越晚值就越大,越早值就越小

--求最小的日期
select least(to_date('1996-10-10','YYYY-MM-DD'),sysdate) from dual;

--求最大的日期
select greatest(to_date('1996-10-10','YYYY-MM-DD'),sysdate) from dual;

--求最大值
select greatest(2,3,1,5) from dual;

--求最小值
select least(2,3,1,5) from dual;

十一、EXTRACT(date FROM datetime)

提取给定日期中指定的时间分量,从参数datetime中提取参数date指定的数据,如年月日

(注意:对DATE只能取年月日,而不能取时分秒,TIMESTAMP时间戳才可以取时分秒)

--查看今年是哪年
select extract(year from sysdate) from dual;

--查看1980年入职的员工
select ename,hiredate from emp where extract(year from hiredate)=1980;

 

标签:函数,--,DD,MM,日期,dual,Oracle,select
来源: https://www.cnblogs.com/codercat/p/16354120.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有