Sql 从字符串中提取日期的一部分

Sql 从字符串中提取日期的一部分,sql,oracle,plsql,partitioning,substr,Sql,Oracle,Plsql,Partitioning,Substr,基本上,我想删除Oracle表中的旧分区,但目前SUBSTR函数有问题 代码: DECLARE l_sql_stmt VARCHAR2(1000); l_date DATE; BEGIN FOR x IN (SELECT * FROM user_tab_partitions WHERE table_name = 'TABLE_NAME') LOOP l_date := to_date( substr( x.h

基本上,我想删除Oracle表中的旧分区,但目前SUBSTR函数有问题

代码:

DECLARE
  l_sql_stmt VARCHAR2(1000);
  l_date     DATE;

BEGIN
  FOR x IN (SELECT * 
             FROM user_tab_partitions
             WHERE table_name = 'TABLE_NAME')
  LOOP
    l_date := to_date( substr( x.high_value, 11, 19 ), 'YYYYMMDD' );
    IF( l_date < add_months( trunc(sysdate), -15 ) )
      THEN
        l_sql_stmt := 'ALTER TABLE TABLE_NAME' || ' DROP PARTITION ' || x.partition_name;
        dbms_output.put_line( l_sql_stmt );
        EXECUTE IMMEDIATE l_sql_stmt;
     END IF;
  END LOOP;
END;
该日期出现在HIGH_值列中。 例如,分区的一个高值=截止日期“1950-01-01 00:00:00”,“SYYYY-MM-DD HH24:MI:SS”,“NLS\U日历=公历”

我需要将日期存储在l_date变量中,以便用于进一步的计算

错误:

ORA-01843:不是有效月份

ORA-06512:在第9行

01843.00000-不是有效的月份

如果高值等于以下值,我想你是这么说的:截止日期“1950-01-01 00:00:00”,“SYYYY-MM-DD HH24:MI:SS”,“NLS\U日历=公历”,那么以下代码行是错误的:

l_date := to_date( substr( x.high_value, 11, 19 ), 'YYYYMMDD' );
错误的原因是掩码YYYYMMDD错误。SUBSTR x.high_值11、19将返回以下内容:

1950-01-01 00:00:00
因此,您希望使用YYYY-MM-DD HH24:MI:SS作为掩码:

l_date := to_date( substr( x.high_value, 11, 19 ), 'YYYY-MM-DD HH24:MI:SS' );
或者SYYYY-MM-DD作为高_值本身,假设必须签署年份:

可能值得您尝试使用正则表达式从高_值中提取掩码,并使用它

更新此选项将用于捕获掩码,假设高_值具有相同的常规格式:

-- Try to capture the mask
WITH x AS (
    SELECT 'TO_DATE('' 1950-01-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')' AS high_value
      FROM dual
)
SELECT REGEXP_SUBSTR(x.high_value, '[^'']+', INSTR(x.high_value, '''', 1, 3))
  FROM x
因此,您可以在代码中使用以下内容:

l_date := TO_DATE( SUBSTR( x.high_value, 11, 19 ), REGEXP_SUBSTR( x.high_value, '[^'']+', INSTR( x.high_value, '''', 1, 3 ) ) );

希望这有帮助。

您遇到了什么问题?它运行了吗?如果运行了,结果和您期望的结果之间有什么区别?在转换整个输入字符串之前,您是否得到ORA-01830:日期格式图片结束?substr参数和格式模型对于日期分区来说是错误的;您期望的原始高值是多少?对于此响应中的延迟,非常抱歉,感谢您提供的建议代码,它按照我想要的方式工作。
l_date := TO_DATE( SUBSTR( x.high_value, 11, 19 ), REGEXP_SUBSTR( x.high_value, '[^'']+', INSTR( x.high_value, '''', 1, 3 ) ) );