Sql 从字符串中提取日期的一部分
基本上,我想删除Oracle表中的旧分区,但目前SUBSTR函数有问题 代码: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
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 ) ) );