【问题标题】:Extracting the actual date information of a partition based on date field in OracleOracle中根据日期字段提取分区的实际日期信息
【发布时间】:2014-03-31 07:54:53
【问题描述】:

我有一个提要表,它使用间隔分区(每月分区)来保存 3 年的历史数据,其中分区键作为表的日期字段。我们需要删除超过 3 年(36 个月)的分区。

删除分区时,我想向用户显示一条消息,告诉用户要删除分区的月份和年份。要获取月份信息,我将不得不使用 USER_TAB_PARTITIONS 表的 HIGH_VALUE 列,因为 partition_name 是系统生成的,例如 'SYSP###',没有提供月份信息。

HIGH_VALUE 列的值是这样的:

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

我无法使用 SUBSTR/REGEXP_SUBSTR 从上述字符串中提取“2011-01-01”。

我使用下面的查询只是为了检查我是否可以提取所需的信息:

select REGEXP_SUBSTR('TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')',10, 10 )  FROM DUAL;

The error I am getting is:
Error: ORA-01036: illegal variable name/number

我不确定我是否在这里犯了一些愚蠢的错误。

非常感谢您的帮助/任何指针/替代方法来实现这一目标。

提前致谢。

问候,

维诺德

【问题讨论】:

  • 能发完整的sql语句吗?
  • 是的,当然。从 DUAL 中选择 REGEXP_SUBSTR('TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')',10, 10 );我得到的错误是:
  • 请更新您的问题,而不是添加评论。
  • 为什么是regexp_substr 而不仅仅是substr? (虽然有那个空间,但它需要从位置 11 开始,而不是 10?)
  • @Patrick Hofman 我已经更新了问题。

标签: sql oracle database-partitioning


【解决方案1】:

你所做的对我来说没有多大意义。

您尝试在date 上应用正则表达式,而不是varchar

你可以试试这个:

select to_char( TO_DATE( ' 2011-01-01 00:00:00'
                       , 'SYYYY-MM-DD HH24:MI:SS'
                       , 'NLS_CALENDAR=GREGORIAN'
                       )
              , 'yyyy-mm-dd'
              )
FROM   DUAL

如果你想从语句中提取值,试试这个:

select substr( 'TO_DATE('' 2011-01-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')',10, 11 )
FROM   DUAL

请注意,我也将您声明中的最后一个 10 更改为 11

【讨论】:

  • 感谢您更正我尝试使用 (') 作为转义字符的查询。
  • 目前还没有。这应该没问题。但如果我卡在其他地方,一定要联系你。再次感谢。
  • @VinodYadav:如果答案有帮助,请不要忘记将问题标记为已回答。请参阅FAQ
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多