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