PLSQL 日期函数

这篇博客详细介绍了Oracle数据库中的PL/SQL日期函数,包括sysdate获取当前日期、add_months进行日期加减月、months_between计算日期间隔、next_day找到下一个特定星期几以及last_day获取月份最后一天等,并提供了相关示例。

日期函数
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值