常用日期型函数
1。Sysdate 当前日期和时间;
2。Last_day 本月最后一天
SQL> Select last_day(sysdate) from dual;
3。Add_months(d,n) 当前日期d后推n个月
用于从一个日期值增加或减少一些月份(其中“n”为正时为增,负时为减)
SQL>Select add_months(sysdate,2) from dual;
注:此函数在Informatica中可用ADD_TO_DATE(d,时间类型,n,) ,此函数也可以对时,分,秒进行操作;
4。NEXT_DAY(d, day_of_week)
返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。(其中数字"1"表示星期中的星期日)
SQL> SELECT next_day(to_date('20120620','YYYYMMDD'),1) FROM dual;
5. 取两个时间进行比较后取其一:
GREATEST(SYSDATE,SYSDATE+1) --取时间大的日期(SYSDATE+1)
LEAST(SYSDATE,SYSDATE+1) --取时间小的日期(SYSDATE)
6。extract()找出日期或间隔值的字段值
SQL> select extract(month from sysdate) "This Month" from dual;
7.months_between:返回两个日期间的月份,如:months_between ('04-11月-05','11-1月-01'),结果,57.7741935
8.round:按指定格式对日期进行四舍五入,如:round(to_date('13-2月-03'),'YEAR'),结果,01-1月-03
round(to_date('13-2月-03'),'MONTH'),结果,01-2月-03
round(to_date('13-2月-03'),'DAY'),结果,16-2月-03
9.(按周四舍五入)
trunc:对日期按指定方式进行截断,如:trunc(to_date('06-2月-03'),'YEAR'),结果,01-1月-03
trunc(to_date('06-2月-03'),'MONTH'),结果,01-2月-03
trunc(to_date('06-2月-03'),'DAY'),结果,02-2月-03
常用日期数据格式
Y或YY或YYY 年的最后一位,两位或三位 Select to_char(sysdate,’YYY’) from dual; 002表示2002年
SYEAR或YEAR SYEAR使公元前的年份前加一负号 Select to_char(sysdate,’SYEAR’) from dual; -1112表示公元前111 2年
Q 季度,1~3月为第一季度 Select to_char(sysdate,’Q’) from dual; 2表示第二季度①
MM 月份数 Select to_char(sysdate,’MM’) from dual; 12表示12月
RM 月份的罗马表示 Select to_char(sysdate,’RM’) from dual; IV表示4月
Month 用9个字符长度表示的月份名 Select to_char(sysdate,’Month’) from dual; May后跟6个空格表示5月
WW 当年第几周 Select to_char(sysdate,’WW’) from dual; 24表示2002年6月13日为第24周
W 本月第几周 Select to_char(sysdate,’W’) from dual; 2002年10月1日为第1周
DDD 当年第几, 1月1日为001,2月1日为032 Select to_char(sysdate,’DDD’) from dual; 363 2002年1 2月2 9日为第363天
DD 当月第几天 Select to_char(sysdate,’DD’) from dual; 04 10月4日为第4天
D 周内第几天 Select to_char(sysdate,’D’) from dual; 5 2002年3月14日为星期一
DY 周内第几天缩写 Select to_char(sysdate,’DY’) from dual; SUN 2002年3月24日为星期天
HH或HH12 12进制小时数 Select to_char(sysdate,’HH’) from dual; 02 午夜2点过8分为02
HH24 24小时制 Select to_char(sysdate,’HH24’) from dual; 14 下午2点08分为14
MI 分钟数(0~59) Select to_char(sysdate,’MI’) from dual; 17下午4点17分
SS 秒数(0~59) Select to_char(sysdate,’SS’) from dual; 22 11点3分22秒
提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式,将它用于分钟也能工作,但结果是错误的。
现在给出一些实践后的用法:
1.上月末天:
SQL> select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from
dual;
2.上月今天
SQL> select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;
也可以用TRUNC函数来求取(截取到"DD")::
SQL>SELECT TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE,-1),'dd'),'yyyy-MM-dd') FROM DUAL;
3.上月首天
SQL> select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;
也可以用TRUNC函数来求取(截取到"MM"):
SELECT TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE,-1),'MM'),'yyyy-MM-dd') FROM DUAL;
转换函数
Oracle的类型转换分为自动类型转换和强制类型转换。常用的类型转换函数有TO_CHAR、TO_DATE或TO_NUMBER
To_char:转换成字符串类型,如:To_char(1234.5, '$9999.9'),结果:$1234.5
To_date:转换成日期类型,如:To_date('1980-01-01', 'yyyy-mm-dd'),结果:01-1月-80
To_number:转换成数值类型,如:To_number('1234.5'),结果:1234.5
以下是ETL(Informatica)实践中用到的时间类型转换成字符类型的用法:
将时间类型转换成字符类型:
TO_CHAR(TRUNC(ADD_TO_DATE(SYSDATE, 'DD', -1), 'DD'), 'YYYYMMDD')
---------------------------------------------------------------
每月2号执行程序,前有抛信号文件;
TO_CHAR($Command_OFF.EndTime,'DD')='02'