oracle从分区表中选择日期

oracle从分区表中选择日期,oracle,oracle11g,Oracle,Oracle11g,下面的语句允许我检索有关表分区的信息: select table_name, partition_name, high_value from user_tab_partitions where table_name = 'T1'; 问题在于,出于未知原因,高_值列的值表示为: TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 是否可以将它们作为日期检索?或者至少对该表达式执行

下面的语句允许我检索有关表分区的信息:

select table_name, partition_name, high_value from user_tab_partitions where table_name = 'T1';
问题在于,出于未知原因,高_值列的值表示为:

TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

是否可以将它们作为日期检索?或者至少对该表达式执行“eval”之类的操作?

该字段被定义为长类型,因此根据分区方案,它可以保存各种值(如“ABC”、数字123、日期的字符串表示等)

不管怎么说,听起来您想要从特定分区获取数据,并且您正试图从元数据中找出分区名称。如果是这种情况,您可以简单地使用partition for子句:

select * from my_partitioned_table partition for (to_date('20150801', 'YYYYMMDD'));
它将从包含特定日期的分区中选择数据(假设您的分区按日期)。这在区间分区中特别有用,Oracle在区间分区中分配像SYS_xxxx这样的分区名称,这种名称充其量是任意的

如果您想删除比给定日期早的分区,那么这就有点棘手了。以上语法用于选择数据,而不是DDL(ALTERTABLE)。要做到这一点,您可以这样做(松散测试):

创建一个函数,以标识哪些分区包含日期小于给定参考日期的数据:

create or replace function fn_partition_is_earlier(i_part_tab_name varchar2, i_partition_position number, i_ref_date in date)
return number
is
    l_date_str varchar2(2000);
    l_date date;
begin
    execute immediate 'select high_value from all_tab_partitions where table_name = :tab and partition_position = :pos'
        into l_date_str
        using i_part_tab_name, i_partition_position;

    execute immediate 'select ' || l_date_str || ' from dual' into l_date;
    if (l_date < i_ref_date) then
        return 1;
    end if;
    return 0;
end;
输出将为您提供让DBA在几个小时内运行的脚本


希望对您有所帮助。

TO_DATE()
函数返回一个
日期。你的问题是什么?到目前为止,是列的确切值,我将它作为字符串获取…这与这个问题有关吗?您好,我试图完成的是实际删除比特定日期早的分区。。。你的陈述有可能吗?
with part_name as (
    select partition_name
    from (
    select fn_partition_is_earlier(p.table_name, p.partition_position, to_date('20130501', 'YYYYMMDD')) should_drop_flag, p.*
    from all_tab_partitions p
    where table_name = 'MY_TAB'
    )
    where should_drop_flag = 1
)
select 'alter table MY_TAB drop partition ' || part_name.partition_name || ' update global indexes;'
from part_name;