在此处结合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;
感谢您的帮助。
答案 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数据类型,那么不要担心其格式,只关心您希望存储日期的精度级别(秒/分钟/小时/日/月/年)。