Oracle 中常见的日期变量;
--定义变量 v_start_date varchar2(8);--开始日期(当日) v_end_date varchar2(8);--结束日期 v_week_start_date varchar2(8);--当周开始日期 v_tenday_start_date varchar2(8);--当旬开始日期 v_month_start_date varchar2(8);--当月开始日期 v_season_start_date varchar2(8);--当季开始日期 v_year_start_date varchar2(8);--当年开始日期 v_lst_mon_start_date varchar2(8);--上月开始日期 v_lst_mon_end_date varchar2(8);--上月结束日期 v_lstyear_mon_start_date varchar2(8);--去年同比月开始日期 v_lst_season_start_date varchar2(8);--上季开始日期 v_lst_season_end_date varchar2(8);--上季结束日期 v_lstyear_season_start_date varchar2(8);--去年同比季开始日期 v_lstyear_start_date varchar2(8);--去年开始日期 v_lstyear_end_date varchar2(8);--去年结束日期 season_day integer;--季天数 year_day integer;--年天数
--变量赋值 --当日 v_start_date := to_char(to_date(p_date , 'yyyyMMdd') , 'yyyyMMdd'); v_end_date := to_char(to_date(v_start_date , 'yyyyMMdd') +1 , 'yyyyMMdd'); v_week_start_date := to_char(trunc(to_date(v_start_date , 'yyyyMMdd'),'iW'),'yyyyMMdd'); --判断为什么旬 当日期为 【1,10】 第一旬 (10,20】 第二旬 (20,31】第三旬 IF cast(substr(v_start_date,7,2) as INT) >= 1 AND cast(substr(v_start_date,7,2) as INT) <= 10 then v_tenday_start_date := to_char(trunc(to_date(v_start_date , 'yyyyMMdd'),'MM'),'yyyyMMdd'); ELSIF cast(substr(v_start_date,7,2) as INT) > 10 AND cast(substr(v_start_date,7,2) as INT) <= 20 THEN v_tenday_start_date := to_char(trunc(to_date(v_start_date , 'yyyyMMdd'),'MM') + 10,'yyyyMMdd'); ELSE v_tenday_start_date := to_char(trunc(to_date(v_start_date , 'yyyyMMdd'),'MM') + 20,'yyyyMMdd'); END IF; v_month_start_date := to_char(trunc(to_date(v_start_date , 'yyyyMMdd'),'MM'),'yyyyMMdd'); v_season_start_date := to_char(trunc(to_date(v_start_date , 'yyyyMMdd'),'Q'),'yyyyMMdd'); v_year_start_date := to_char(trunc(to_date(v_start_date , 'yyyyMMdd'),'yyyy'),'yyyyMMdd'); v_lst_mon_start_date := to_char(add_months(to_date(v_month_start_date , 'yyyyMMdd'),-1),'yyyyMMdd'); v_lst_mon_end_date := to_char(add_months(to_date(v_end_date , 'yyyyMMdd'),-1),'yyyyMMdd'); --v_lst_mon_end_date :=to_char((to_date(v_month_start_date,'yyyyMMdd'),-1),'yyyyMMdd');
这些变量一般在聚合的时候如:
--当日累计、当周累计、当旬累计、当月累计、当季累计、当年累计、昨日累计、上周当天、上月当天、去年今日累计、上月累计、去年同月累计、上季累计、去年同季累计、去年累计的时候会用到。
--在oracle中trunc函数有两种用法 --1.第一种是对数字进行截取语法:trunc(num,[int]); 它的使用是去掉数字num小数位以后的部分,并且不进行四舍五入。 >select trunc(123.456) from dual; trunc(123.456) ---------------------- 123 --2.如果trunc函数带有两个参数,它的使用是保留int位小数,并且对小位数也不进行四舍五入运算。 >select trunc(123.456,2) from dual; trunc(123.456,2) 123.45 --3、有一点要注意的是int参数可以使用负数,它的使用是从小数点的左侧开始截取,并把截取的位数替换成0. >select trunc(123.456,-2) from dual; trunc(123.456,-2) -------------------- 100 --4.trunc函数的第二种用法是对日期进行提取,返回当前日期的第一天。可以是年、月、星期的第一天。 Oracle trunc()函数的用法 /**************日期********************/ 1.select trunc(sysdate) from dual --2011-3-18 今天的日期为2011-3-18 2.select trunc(sysdate, 'mm') from dual --2011-3-1 返回当月第一天. 3.select trunc(sysdate,'yy') from dual --2011-1-1 返回当年第一天 4.select trunc(sysdate,'dd') from dual --2011-3-18 返回当前年月日 5.select trunc(sysdate,'yyyy') from dual --2011-1-1 返回当年第一天 6.select trunc(sysdate,'d') from dual --2011-3-13 (星期天)返回当前星期的第一天 7.select trunc(sysdate, 'hh') from dual --2011-3-18 14:00:00 当前时间为14:41 8.select trunc(sysdate, 'mi') from dual --2011-3-18 14:41:00 TRUNC()函数没有秒的精确 --5.trunc在对日期进行处理的时候,只能对日期进行提取不能是数字或者字符 >select trunc(to_date('2015-05-08','yyyy-mm-dd'),'yyyy') from dual; trunc(to_date('2015-05-08','yyyy-mm-dd'),'yyyy') -------------- 2015/01/01 00:00:00 >select trunc('2015-05-08','yyyy') from dual; error at line 1: ORA-01722:invalid number