数据库
首页 > 数据库> > Oracle基础(六):日期类型和日期函数

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

作者:互联网

一、日期类型

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