oracle日期函数
Oracle:
日期时间函数用于处理DATA和TIMESTAMP类型的数据。除了函数MONTHS_BETWEEN返回数字值外,其他日期函数均返回DATE类型的数据。
-------------------------------------------------------
CURRENT_DATE、SYSDATE、CURRENT_TIMESTAMP、LOCALTIMESTAMP:返回当前会话时区所对应的日期时间。
SELECT current_date FROM dual;
-------------------------------------------------------
EXTRACT:用于从日期时间值中取得所需要的特定数据(例如年份、月份等)。
SELECT extract(year from sysdate) FROM dual;
extract(month from sysdate)
extract(day from sysdate)
extract(hour from urrent_timestamp)
-------------------------------------------------------
LAST_DAY(date):返回指定日期所在月份的最后一天。
SELECT last_day(sysdate) FROM dual;
-------------------------------------------------------
ADD_MONTHS(date,n):返回特定日期时间date之后(或之前)的n个月所对应的日期时间(n为正整数表示之后;n为负整数表示之前)。
SELECT add_months(sysdate, -14) FROM dual;
-------------------------------------------------------
MONTHS_BETWEEN(date1,date2):返回日期date1和date2之间相关的月数。如果date1小于date2,则返回负数。如果日期date1和date2的天数相同或都是月底,则返回整数,否则以每月31天为准来计算结果的小数部分。
SELECT months_between(sysdate, date‘2009-01-01’) FROMdual;
如果只要计算月份差,则可用以下方法:
SELECT months_between(trunc(sysdate, ‘MONTH’) ,last_day(date'2009-01-01')) FROM dual;
-------------------------------------------------------
NEXT_DAY(date, char):返回指定日期后的第一个工作日(由char指定)所对应的日期。
SELECT next_day(sysate, ‘星期一’) FROM dual;
-------------------------------------------------------
ROUND(date[,fmt]):返回日期时间的四舍五入结果。如果fmt指定年度,则以7月1日为分界线;如果fmt指定月,则以16日为分界线;如果指定天,则中午12:00时为分界线。
SELECT round(sysdate, ‘MONTH’) FROM dual;
-------------------------------------------------------
TRUNC(date[,fmt]):用于截断日期时间数据。如果fmt指定年度(YEAR或YY或YYYY),则结果为本年度的1月1日0时0分(下同);如果fmt指定月(MONTH或MM),则结果为本月1日;如果fmt指定日(DD),则结果为当天;如果fmt指定星期(DAY),则结果为本周日;如果fmt指定小时(HH),则结果为date截断分钟后的值;如果fmt指定分钟(MI),则结果为date截断秒后的值;
SELECT trunc(sysdate, ‘MONTH’) FROM dual;
举例:
trunc(sysdate,‘DD’) 当日0时0分
trunc(sysdate,‘MONTH’) 当月第一天
trunc(last_day(sysdate), ‘DD’) 当月最后一天
trunc(sysdate, ‘YEAR’) 当年第一天
add_months(trunc(sysdate, ‘YEAR’), 12) – 1 当年最后一天
add_months(trunc(sysdate, ‘YEAR’),12) 第二年第一天
Oracle_各种日期计算方法
SQL> SELECT TO_CHAR(SYSDATE,'dd-mon-yyyy','nls_date_language=American') from dual;
TO_CHAR(SYSDATE,'DD-MON-YYYY',
------------------------------
22-mar-2007
一个月的第一天
SELECT to_date(to_char(SYSDATE,'yyyy-mm')||'-01','yyyy-mm-dd') FROM dual
sysdate 为数据库服务器的当前系统时间。
to_char 是将日期型转为字符型的函数。
to_date 是将字符型转为日期型的函数,一般使用 yyyy-mm-dd hh24:mi:ss格式,当没有指定时间部分时,则默认时间为 00:00:00dual 表为sys用户的表,这个表仅有一条记录,可以用于计算一些表达式,如果有好事者用 sys 用户登录系统,然后在 dual 表增加了记录的话,那么系统99.999%不能使用了。为什么使用的时候不用 sys.dual 格式呢,因为 sys 已经为 dual 表建立了所有用户均可使用的别名。
一年的第一天
SELECT to_date(to_char(SYSDATE,'yyyy')||'-01-01','yyyy-mm-dd') FROM dual
季度的第一天
SELECT to_date(to_char(SYSDATE,'yyyy-')||lpad(floor(to_number(to_char(SYSDATE,'mm'))/3)*3+1,2,'0')||'-01','yyyy-mm-dd') FROM dual
floor 为向下取整
lpad 为向左使用指定的字符扩充字符串,这个扩充字符串至2位,不足的补'0'。当天的半夜
SELECT trunc(SYSDATE)+1-1/24/60/60 FROM dualtrunc 是将 sysdate 的时间部分截掉,即时间部分变成 00:00:00
Oracle中日期加减是按照天数进行的,所以 +1-1/24/60/60 使时间部分变成了 23:59:59。
Oracle 8i 中仅支持时间到秒,9i以上则支持到 1/100000000 秒。上个月的最后一天
SELECT trunc(last_day(add_months(SYSDATE,-1)))+1-1/24/60/60 FROM dual
add_months 是月份加减函数。
last_day 是求该月份的最后一天的函数。本年的最后一天
SELECT trunc(last_day(to_date(to_char(SYSDATE,'yyyy')||'-12-01','yyyy-mm-dd')))+1-1/24/60/60 FROM dual
本月的最后一天
select trunc(last_day(sysdate))+1-1/24/60/60 from dual
本月的第一个星期一
SELECT next_day(to_date(to_char(SYSDATE,'yyyy-mm')||'-01','yyyy-mm-dd'),'星期一') FROM dual
next_day 为计算从指定日期开始的第一个符合要求的日期,这里的'星期一'将根据NLS_DATE_LANGUAGE的设置稍有不同。去掉时分秒
select trunc(sysdate) from dual
显示星期几
SELECT to_char(SYSDATE,'Day') FROM dual
取得某个月的天数
SELECT trunc(last_day(SYSDATE))-to_date(to_char(SYSDATE,'yyyy-mm')||'-01','yyyy-mm-dd')+1 FROM dual
判断是否闰年
SELECT decode(to_char(last_day(to_date(to_char(SYSDATE,'yyyy')||'-02-01','yyyy-mm-dd')),'dd'),'28','平年','闰年') FROM dual
一个季度多少天
SELECT last_day(to_date(to_char(SYSDATE,'yyyy-')||lpad(floor(to_number(to_char(SYSDATE,'mm'))/3)*3+3,2,'0')||'-01','yyyy-mm-dd'))-to_date(to_char(SYSDATE,'yyyy-')||lpad(floor(to_number(to_char(SYSDATE,'mm'))/3)*3+1,2,'0')||'-01','yyyy-mm-dd')+1FROM dual ---------------------------------------------------------------------------------------------------------------------------------------可以直接赋值给变量,不用写成函数形式的。另函数适用于pb6.5,一个汉字占两个字节,如果用于pb8.0以上请根据实际情况修改
//1.生肖(年份参数:int ls_year 返回参数:string):
mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(ls_year -1900,12)+13)*2 -1,2)
//2.天干地支(年份参数:int ls_year 返回参数:string):
mid(fill('甲乙丙丁戊己庚辛壬癸',40),(mod(ls_year -1924,10)+11)*2 -1,2)+mid(fill('子丑寅卯辰巳午未申酉戌亥',48),(mod(ls_year -1924,12)+13)*2 -1,2)
//3.星座(日期参数:date ls_date 返回参数:string):
mid("摩羯水瓶双鱼白羊金牛双子巨蟹狮子处女天秤天蝎射手摩羯",(month(ls_date)+sign(sign(day(ls_date) -(19+integer(mid('102123444423',month(ls_date),1))))+1))*4 -3,4)+'座'
//4.判断闰年(年份参数:int ls_year 返回参数:int 0=平年,1=闰年):
abs(sign(mod(sign(mod(abs(ls_year),4))+sign(mod(abs(ls_year),100))+sign(mod(abs(ls_year),400)),2)) -1)
//5.某月天数(日期参数:date ls_date 返回参数:int):
integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ls_date)),4))+sign(mod(abs(year(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'3232332323',month(ls_date),1)))
//6.某月最后一天日期(日期参数:date ls_date 返回参数:date):
date(year(ls_date),month(ls_date),integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ls_date)),4))+sign(mod(abs(year(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'3232332323',month(ls_date),1))))
//7.另一个求某月最后一天日期(日期参数:date ls_date 返回参数:date):
a.
RelativeDate (date(year(ls_date)+sign(month(ls_date) -12)+1,mod(month(ls_date)+1,13)+abs(sign(mod(month(ls_date)+1,13)) -1),1),-1)
b.
RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),-1)
//8.另一个求某月天数(日期参数:date ls_date 返回参数:int):
a.
day(RelativeDate (date(year(ls_date)+sign(month(ls_date) -12)+1,mod(month(ls_date)+1,13)+abs(sign(mod(month(ls_date)+1,13)) -1),1),-1))
b.
day(RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),-1))
//9.某月某日星期几--同PB系统函数DayName(日期参数:date ls_date 返回参数:string):
'星期'+mid('日一二三四五六',(mod(year(ls_date) -1 + int((year(ls_date) -1)/4) - int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + daysafter(date(year(ls_date),1,1),ls_date)+1,7)+1)*2 -1,2)
//10.求相隔若干月份后的相对日期(日期参数:date ls_date 相隔月份(可取负数):int ls_add_month 返回参数:date):
date(year(ls_date)+int((month(ls_date)+ls_add_month)/13),long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2)),day(ls_date) -integer(right(left(string(day(RelativeDate (date(year(ls_date)+int((month(ls_date)+ls_add_month)/13)+sign(long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2)) -12)+1,mod(long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2))+1,13)+abs(sign(mod(long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2))+1,13)) -1),1),-1)) -day(ls_date),'00')+'00000',5),3))/100)
//11.求某日在当年所处的周数(日期参数:date ls_date 返回参数:int):
//a.周始日为星期天
//a1
abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -mod(year(ls_date) -1 + int((year(ls_date) -1)/4) - int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + 1,7) +1),ls_date)+1)/7)))
//a2(使用DayNumber函数)
abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -DayNumber(date(year(ls_date),1,1))+1),ls_date)+1)/7)))
//b.周始日为星期一
//b1
abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -integer(mid('6012345',mod(year(ls_date) -1 + int((year(ls_date) -1)/4) - int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + 1,7),1))),ls_date)+1)/7)))
//b2(使用DayNumber函数)
abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -integer(mid('6012345',DayNumber(date(year(ls_date),1,1)),1))),ls_date)+1)/7)))
//12.求某日相对于过去某一日期所处的周数(日期参数:date ls_date_1(要求的某日),ls_date_2(过去的某日) 返回参数:int):
//注:ls_date_1>ls_date_2
//a.周始日为星期天
//a1
abs(int(-((daysafter( RelativeDate(ls_date_2, -mod(year(ls_date_2) -1 + int((year(ls_date_2) -1)/4) - int((year(ls_date_2) -1)/100) + int((year(ls_date_2) -1)/400) + daysafter(date(year(ls_date_2),1,1),ls_date_2)+ 1,7) +1),ls_date_1)+1)/7)))
//a2(使用DayNumber函数)
abs(int(-((daysafter( RelativeDate(ls_date_2, -DayNumber(ls_date_2)+1),ls_date_1)+1)/7)))
//b.周始日为星期一
//b1
abs(int(-((daysafter( RelativeDate(ls_date_2, -integer(mid('6012345',mod(year(ls_date_2) -1 + int((year(ls_date_2) -1)/4) - int((year(ls_date_2) -1)/100) + int((year(ls_date_2) -1)/400) + daysafter(date(year(ls_date_2),1,1),ls_date_2)+ 1,7) ,1))),ls_date_1)+1)/7)))
//b2(使用DayNumber函数)
abs(int(-((daysafter( RelativeDate(ls_date_2, -integer(mid('6012345',DayNumber(ls_date_2),1))),ls_date_1)+1)/7)))
以上转贴,以下补充,欢迎大家一起来补充 昕晨 2004.6
13 PB中 DaysAfter ( date1, date2 ) 只能返回日期类型相差天数,SecondsAfter ( time1, time2 )只能返回时间相差妙,没有真对日期时间类型的函数,可以用下面一条语句实现:
lont ll_allseconds
datetime ldt_bgn,ldt_end
ll_allseconds=(daysafter(date(ldt_bgn),date(ldt_end))*86400+SecondsAfter(time(ldt_bgn),time(ldt_end)))
//返回两个DATETIME相差妙,如果要得到相差分钟,就 除以60就行,得到小时类似。

浙公网安备 33010602011771号