从列中派生月份并在范围分区中使用该月份

时间:2015-08-28 09:38:25

标签: oracle date partition

在此处结合2个问题作为我的要求的一部分。

我想在date列上执行每月范围分区,而date列会将值存储为Year-month格式

1)是否有任何函数以此格式获取日期

  

例如:i / p - 04-07-2015 o / p - 2015-07

我已经使用以下方式实现,但这样数据将以字符串格式存储。

我的第二个问题是,我将在sep中加载aug的数据,并且每个分区中的数据将基于上面派生的列... ...

SELECT TO_CHAR ( (TRUNC (TO_DATE (range_st_date), 'YYYY')),
'YYYY') || '-' || RTRIM (TO_CHAR ( (TRUNC (TO_DATE (range_st_date),  
'MM')), 'MM')) FROM DUAL;

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果您要做的就是在桌面上按月设置范围分区,则无需对日期进行任何操作即可进入正确的分区。 E.g:

create table test1 (col1 number,
                    col2 date)
partition by range (col2)
 (partition part_201507 values less than (to_date('01/08/2015', 'dd/mm/yyyy')),
  partition part_201508 values less than (to_date('01/09/2015', 'dd/mm/yyyy')),
  partition max_val values less than (maxvalue));

insert into test1
select 1, to_date('14/07/2015 01:46:25', 'dd/mm/yyyy hh24:mi:ss') from dual union all
select 2, to_date('08/08/2015 14:19:34', 'dd/mm/yyyy hh24:mi:ss') from dual;

commit;

select * from test1 partition (part_201507);

      COL1 COL2                 
---------- ---------------------
         1 14/07/2015 01:46:25  

select * from test1 partition (part_201508);

      COL1 COL2                 
---------- ---------------------
         2 08/08/2015 14:19:34  

alter session set nls_date_format = 'dd/mm/yyyy hh24:mi:ss';

如果你是在月份+年之后,那么你可以做一个按月分组的聚合查询,然后简单地将日期截断为一个月,例如

select col1,
       col2,
       trunc(col2, 'mm') mon_col2
from   test1;

      COL1 COL2                  MON_COL2             
---------- --------------------- ---------------------
         1 14/07/2015 01:46:25   01/07/2015 00:00:00  
         2 08/08/2015 14:19:34   01/08/2015 00:00:00

作为DATE数据类型存储的数据除了Oracle自己的内部日期格式外没有任何特定格式。因此,如果要以人类可读的格式输出日期,则必须将其转换为字符串以供显示。这可以是隐式的,基于您在nls_date_format参数中设置的格式,或者可以使用TO_CHAR()以您希望将其显示为的任何格式显式。

简而言之,如果您希望将日期继续存储为DATE数据类型,那么不要担心其格式,只关心您希望存储日期的精度级别(秒/分钟/小时/日/月/年)。