2

让我们创建一个测试表来说明问题:

CREATE TABLE "TMP1" (
    "X" VARCHAR2(256 BYTE) NOT NULL
) LOGGING NOCOMPRESS NOCACHE;

INSERT INTO "TMP1" VALUES ('XxYyyyZzzWww_123456_0106201395810_0106201395810.csv');
INSERT INTO "TMP1" VALUES ('XxYyyyZzzWww_123456_31052013155754_31052013155754.csv');
INSERT INTO "TMP1" VALUES ('XxYyyyZzzWww_123456_02062013130000_02062013130000.csv');

现在提出请求:

select
        TMP2.X
    , TMP2.STARTDATETIME
    , to_char(TMP2.STARTDATETIME, 'DDMMYYYYHH24MISS') "to_char(StartDateTime)"
    , TMP2.ENDDATETIME
    , to_char(TMP2.ENDDATETIME, 'DDMMYYYYHH24MISS') "to_char(EndDateTime)"
from (
        select
                "X"
            , to_date(case length(regexp_substr("X", '\d+', 1, 2, 'i'))
                            when 14 then regexp_substr("X", '\d+', 1, 2, 'i')
                            when 13 then substr(regexp_substr("X", '\d+', 1, 2, 'i'), 0, 8) 
                                || '0' || substr(regexp_substr("X", '\d+', 1, 2, 'i'), 9)
                end, 'DDMMYYYYHH24MISS') StartDateTime

            , to_date(case length(regexp_substr("X", '\d+', 1, 3, 'i'))
                            when 14 then regexp_substr("X", '\d+', 1, 3, 'i')
                            when 13 then substr(regexp_substr("X", '\d+', 1, 3, 'i'), 0, 8) 
                                || '0' || substr(regexp_substr("X", '\d+', 1, 3, 'i'), 9)
                end, 'DDMMYYYYHH24MISS') EndDateTime
        from
            "TMP1"
) TMP2;

在此查询中,我们剪切了一个子字符串并将其转换为日期。然后我们尝试做反向转换,但不起作用。

结果:

在此处输入图像描述

to_date功能有效,但功能to_char无效。

4

1 回答 1

2

您的样本工作正常。

我怀疑您的 Oracle 数据库实例存在问题 - 内部 SQL 重写/优化存在几个错误,Oracle 最终执行错误重写的查询。我会尝试关闭重写(查找 QUERY REWRITE ENABLED、EXPLAIN_REWRITE、EXPLAIN_PLAN)。

有时重新启动数据库会有所帮助。

于 2013-09-25T13:37:53.930 回答