1、DATE
类型:在数据库中存储固定为7个字节,每个字节分别表示:世纪、年、月、日、时、分、秒
2、TIMESTAMP
时间戳类型:与DATE类型的区别是不仅可以保存日期和时间,还能保存小数秒,最高精度可以到纳秒(ns),在数据库中存储7或11个字节,前面7个字节与DATE相同。
两个常用内置函数:
(1)SYSDATE
:对应数据库一个内置函数,该函数返回一个DATE类型的当前系统时间
(2)SYSTIMESTAMP
:返回一个SYSTIMESTAMP时间戳类型的当前系统时间,精确到毫秒。
select sysdate,systimestamp from dual;
可以将给定字符串按照指定的日期格式转换为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;
可以将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;
SYSDATE
默认显示格式为:DD-MON-RR
,YY
格式是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;
返回给定日期date所在月的最后一天(返回一个DATE)
select last_day(sysdate) from dual; select to_char(last_day(sysdate),'YYYY-MM-DD') from dual;
对指定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;
返回计算两个指定日期之间相差的月,实际运算是date1-date2,如果date2比date1晚会得到负值,
除非两个日期间隔是整数月,否则将会得到带小数位的结果
(日期DATE直接计算加减结果是天数,如果计算月数则使用该函数)
--查看每个员工入职至今多少个月? select ename,months_between(sysdate,hiredate) from emp;
返回给定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;
求小值与最大值,比较函数,是变长参数,即:可以有多个参数值,返回结果是参数列表中最大或最小的值,参数的类型必须一致。
(注:该函数除了日期可以使用以外,凡是可以比较大小的都可以使用)
对于日期而言,越晚值就越大,越早值就越小
--求最小的日期 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;
提取给定日期中指定的时间分量,从参数datetime中提取参数date指定的数据,如年月日
(注意:对DATE
只能取年月日,而不能取时分秒,TIMESTAMP时间戳才可以取时分秒)
--查看今年是哪年 select extract(year from sysdate) from dual; --查看1980年入职的员工 select ename,hiredate from emp where extract(year from hiredate)=1980;