日期函数
1.sysdate 当前系统时间
日期加减数字=日期加减天数
日期-日期=相差的天数
2.add_months(日期,数) 日期加减月数
数会自动截断取整
select add_months(sysdate,1),
add_months(sysdate,-1),
add_months(sysdate,12),
add_months(sysdate,1.9)
from dual
--查询三个月前距今多少天
select sysdate-add_months(sysdate,-3)
from dual
--查询三个月后是几月
select to_char(add_months(sysdate,3),'mm')
from dual
--查询一年后的今天是星期几
select to_char(add_months(sysdate,12),'dy')
from dual
3.months_between(日期1,日期2) 日期之间相差的月数
在oracle中默认一个月有31天
1天=1/31月
select months_between(date'2021-7-1',date'2021-5-1') A,
months_between(date'2021-5-1',date'2021-7-1') B,
months_between(date'2021-7-15',date'2021-5-1') C,
months_between(sysdate,date'2021-5-1') D
from dual
--查询2008-8-8距今几个月,四舍五入保留两位小数
select round(months_between(sysdate,date'2008-8-8'),2)
from dual
--查询2012-12-21距今多少年,四舍五入保留两位小数
select round(months_between(sysdate,date'2012-12-21')/12,2)
from dual
--查询2008-8-8距今几年零几个月零几天
--小数*31得天
select trunc(months_between(sysdate, date '2008-8-8') / 12) || '年' ||
trunc(months_between(sysdate, date '2008-8-8') -
(trunc(months_between(sysdate, date '2008-8-8') / 12) * 12)) || '月' ||
trunc(((months_between(sysdate, date '2008-8-8') -
(trunc(months_between(sysdate, date '2008-8-8') / 12) * 12)) -
trunc(months_between(sysdate, date '2008-8-8') -
(trunc(months_between(sysdate, date '2008-8-8') / 12) * 12))) * 31) || '日' 岁
from dual
select trunc(months_between(sysdate,date'2008-8-8')/12) 年,
trunc(mod(months_between(sysdate,date'2008-8-8'),12)) 月,
trunc(mod(months_between(sysdate,date'2008-8-8'),1)*31) 日
from dual
--日期推进得天
select trunc(sysdate-add_months(date'2008-8-8',trunc(months_between(sysdate,date'2008-8-8')))) A
from dual
1.求两个日期相差的
年数 months_between()/12
月数 months_between()
天数 日期相减
小时数 日期相减*24
分钟数 日期相减*24*60
秒数 日期相减*24*60*60
2.日期加减
年 add_months(日期,年数*12)
月 add_months(日期,月数)
天 日期±天数
小时 日期±小时数/24
分钟 日期±/分钟数24/60
秒 日期±秒数/24/60/60
--把hiredate当做员工生日,查询每个人现在几岁零几个月零几天
4.next_day(日期,'星期几'|对应的数字) 下一个星期几
select next_day(sysdate,'星期三'),
next_day(sysdate,7)
from dual
--下周的星期五
select next_day(sysdate,'星期五')
from dual
--求2020年的第一个星期三
select next_day(date'2020-1-1'-1,'星期三')
from dual
--求下周周六是多少号
select next_day(next_day(sysdate-1,'星期日'),'星期六')
from dual
求下周几的方法:先求本周日,再求本周日的下一个周几,(日期-1)
select next_day(next_day(sysdate-1,'星期日'),'星期六')
from dual
--求下下周的周六
select next_day(next_day(sysdate-1,1),7)+7
from dual
--求下下下下下下下下下周的周三
select next_day(next_day(sysdate-1,1),4)+56
from dual
--求上上上周的周四
select next_day(next_day(sysdate-1,1),5)-7-7-7-7
from dual
--求下周周日是多少号
select next_day(next_day(sysdate-1,1),1)
from dual
5.last_day(日期) 月的最后一天
select last_day(sysdate)
from dual
--求平闰年
--求2月份有多少天
select last_day(to_date(to_char(sysdate,'yyyy')||'-2-1','yyyy-mm-dd'))
from dual
--查询3个月后的月末是星期几
select to_char(last_day(add_months(sysdate,3)),'dy')
from dual
6.round(日期,'格式') 四舍五入到日期之初(过半则入,不过则舍)
yyyy 1-6月 本年 7-12月 下一年 --到最近的年初
mm 1-15日 本月 16-31日 下个月 --到最近的月初 (月份按照一个月30来计算)
d/dy 1-4(周日-周三) 本周 5-7(周四-周六) 下周 --到最近的周日 (周日是一周的第一天)
dd 0-11时 今天 12-23时 下一天--最近的一天之初
hh 0-29分 本小时 30-59分 下一个小时--最近的整时
mi 0-30秒 这分钟 31-59秒 下分钟--最近的整分
q <=当季第二个月的15日 本季 >=当季第二个月的16日 下个季度
不能四舍五入到整秒
--当前日期四舍五入到整年,整季,整月,整周,整天,整时,整分 分别哪个日期 [板书]
select round(sysdate,'yyyy') 整年,
round(sysdate,'q') 整季,
round(sysdate,'mm') 整月,
round(sysdate,'d') 整周,
round(sysdate,'dd') 整天,
round(sysdate,'hh') 整时,
round(sysdate,'mi') 整分
--,round(sysdate,'ss') --错误
from dual
7.trunc(日期,'格式') 截断到日期之初
yyyy 年初
q 季初
mm 月初
d/dy 周初--周日
dd 天初--0点0分
hh 整时
mi 整分
SS --错误
--当前日期截断到整年,整季,整月,整周,整天,整时,整分 分别哪个日期[板书]
select trunc(sysdate,'yyyy') 整年,
trunc(sysdate,'q') 整季,
trunc(sysdate,'mm') 整月,
trunc(sysdate,'d') 整周,
trunc(sysdate,'dd') 整天,
trunc(sysdate,'hh') 整时,
trunc(sysdate,'mi') 整分
--,round(sysdate,'ss') 错误
from dual
--求平闰年
--求今年有多少天
select to_char(add_months(trunc(sysdate,'yyyy'),12)-1,'ddd')
from dual
select add_months(trunc(sysdate,'yyyy'),12)-trunc(sysdate,'yyyy')
from dual
--求二月有多少天
select last_day(add_months(trunc(sysdate,'yyyy'),1))
from dual
select add_months(trunc(sysdate,'yyyy'),2)-1
from dual
函数名(日期,'格式')的横向对比
│to_char │ROUND │ TRUNC
───────┼──────────────┼──────────────┼───────
yyyy │提取年 │返回最近的年初│返回年初
q │提取季度 │返回最近的季初│返回季初
mm │提取月 │返回最近的月初│返回月初
dy │提取星期(汉字)│返回最近的周初│返回周初(周日)
d │提取星期(数字)│返回最近的周初│返回周初(周日)
dd │提取日 │返回最近的天初│返回天初
hh/hh12│提取时(12制) │返回最近的时初│返回时初
hh24 │提取时(24制) │返回最近的时初│返回时初
mi │提取分 │返回最近的分初│返回分初
SS │提取秒 │/*精度错误*/ │/*精度错误*/
日期函数小结
函数名 │SYSDATE│add_months│months_between│next_day│last_day│ROUND │trunc│
────────┼───────┼──────────┼──────────────┼────────┼────────┼──────┼─────┤
返回类型│ 日期 │ 日期 │ 数值 │ 日期 │ 日期 │ 日期 │日期 │
--通用函数
1.userenv('language') 查看客户端字符集
select userenv('language')
from dual
2.greatest(参1,参2...) 返回多个参数中的最大值
参数的数据类型跟第一个参数的数据类型一致
空最大
select greatest(100,200,300)
from dual
select greatest(date'2020-1-1',sysdate,date'2022-8-5')
from dual
select greatest('a','b','c')
from dual
select greatest('100','1000',50,null)
from dual
3.least(参1,参2..) 返回多个参数中的最小值
参数的数据类型跟第一个参数的数据类型一致
空最小
select least(100,200,300)
from dual
select least(date'2020-1-1',sysdate,date'2022-8-5')
from dual
select least('a','b','c')
from dual
select least('100','1000',50,null)
from dual
--查询员工编号,经理编号,部门编号
--以及他们的最大值和最小值
select empno,mgr,deptno,greatest(empno,mgr,deptno),least(empno,mgr,deptno)
from emp
这篇博客详细介绍了Oracle数据库中的PL/SQL日期函数,包括sysdate获取当前日期、add_months进行日期加减月、months_between计算日期间隔、next_day找到下一个特定星期几以及last_day获取月份最后一天等,并提供了相关示例。

9112

被折叠的 条评论
为什么被折叠?



