如何让SQL更灵活地处理插补的内容';RR-MM-DD HH.MI.SSXFF AM';创建[22008][1855]ORA-01855:需要上午/上午或下午/下午

如何让SQL更灵活地处理插补的内容';RR-MM-DD HH.MI.SSXFF AM';创建[22008][1855]ORA-01855:需要上午/上午或下午/下午,sql,oracle,Sql,Oracle,我必须用几种不同的方式输入日期 to_时间戳('2015-10-06 0:00:00.0 AM','RR-MM-DD HH.MI.SSXFF AM') 及 to_时间戳('2115-10-06 01:00:00.0 AM','RR-MM-DD HH.MI.SSXFF AM') 两种错误都有 ORA-01849:小时必须介于1和12之间 [22008][1855]ORA-01855:需要上午/上午或下午/下午 我试图实现的是能够使用2115-10-06 01:00:00.0 am或2015-10-

我必须用几种不同的方式输入日期

  • to_时间戳('2015-10-06 0:00:00.0 AM','RR-MM-DD HH.MI.SSXFF AM')
  • to_时间戳('2115-10-06 01:00:00.0 AM','RR-MM-DD HH.MI.SSXFF AM')
  • 两种错误都有

  • ORA-01849:小时必须介于1和12之间

  • [22008][1855]ORA-01855:需要上午/上午或下午/下午


  • 我试图实现的是能够使用
    2115-10-06 01:00:00.0 am
    2015-10-06 0:00:00.0 am
    而不会给我一个关于此处约束的错误
    'RR-MM-DD HH.MI.SSXFF am'
    一个12小时的时钟没有0小时

    如果要支持第0小时作为第12小时的别名,则可以编写自定义函数以将0替换为12:

    Oracle 11g R2架构设置

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    
    查询1

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    
    更新使用
    案例
    语句:

    查询1

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    

    12小时的时钟没有0小时

    如果要支持第0小时作为第12小时的别名,则可以编写自定义函数以将0替换为12:

    Oracle 11g R2架构设置

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    
    查询1

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    
    更新使用
    案例
    语句:

    查询1

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    

    CREATE FUNCTION parse_timestamp(
      in_string VARCHAR2
    ) RETURN TIMESTAMP
    IS
      p_string    VARCHAR2(30) := in_string;
      c_fix_hours CHAR(61) := '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$';
    BEGIN
      IF REGEXP_LIKE( p_string, c_fix_hours, 'i' ) THEN
        p_string := REGEXP_REPLACE( p_string, c_fix_hours, '\112\2', 1, 1, 'i' );
      END IF;
      RETURN TO_TIMESTAMP( p_string, 'RR-MM-DD HH12.MI.SSXFF AM' );
    END;
    / 
    
    SELECT parse_timestamp(
             '2015-10-06 0:00:00.0 AM'
           ),
           parse_timestamp(
             '2115-10-06 01:00:00.0 AM'
           )
    FROM   DUAL
    
    | PARSE_TIMESTAMP('2015-10-060:00:00.0AM') | PARSE_TIMESTAMP('2115-10-0601:00:00.0AM') |
    |------------------------------------------|-------------------------------------------|
    |                    2015-10-06 00:00:00.0 |                     2115-10-06 01:00:00.0 |
    
    WITH test_data ( value ) AS (
      SELECT '2015-10-06 0:00:00.0 AM'  FROM DUAL UNION ALL
      SELECT '2115-10-06 01:00:00.0 AM' FROM DUAL UNION ALL
      SELECT '5-9-7 00:59:59.234 PM'    FROM DUAL
    )
    SELECT TO_TIMESTAMP(
             CASE
             WHEN REGEXP_LIKE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', 'i' )
             THEN REGEXP_REPLACE( value, '^(\d{1,4}-\d\d?-\d\d? )00?(:[0-5]?\d:[0-5]?\d(\.\d+)? [AP]M)$', '\112\2', 1, 1, 'i' ) 
             ELSE value
             END,
             'RR-MM-DD HH12.MI.SSXFF AM'
           ) AS datetime
    FROM   test_data
    
    |                DATETIME |
    |-------------------------|
    |   2015-10-06 00:00:00.0 |
    |   2115-10-06 01:00:00.0 |
    | 2005-09-07 12:59:59.234 |
    

    RR
    是没有世纪的年份,请尝试使用
    YYYY
    来代替。检查:每个周期由12个小时组成,编号为:12(作为零)、1、2、3、4、5、6、7、8、9、10和11。-不允许使用0。@WernfriedDomscheit我编写了一个脚本来提取数据,但我并没有获取相同的数据并将其放回。当我添加导致ORA-01818的
    HH24
    时:“HH24”禁止使用子午线指示器,这意味着你不能使用
    AM
    PM
    -你不能同时使用12小时和24小时格式。
    RR
    是没有世纪的一年,改为尝试
    YYYY
    。检查:每个时段由12个小时组成,编号为:12(充当零)、1、2、3、4、5、6、7、8、9、10和11。-不允许使用0。@WernfriedDomscheit我编写了一个脚本来提取数据,但我并没有获取相同的数据并将其放回。当我添加
    HH24
    导致
    ORA-01818时:“HH24”阻止使用子午线指示器
    ,这意味着你不能使用
    AM
    PM
    -你不能同时使用12小时和24小时格式。非常感谢你的详细回复,但我无法更改数据库中的任何内容。这将与我正在测试的内容背道而驰。我需要弄清楚的是,它允许我使用
    24H
    time格式。建议?@noname\u dev使用
    CASE
    语句。非常感谢您的详细回复,但我无法更改数据库中的任何内容。这将与我正在测试的内容背道而驰。我需要弄清楚的是,它允许我使用
    24H
    time格式。建议?@noname\u dev使用
    CASE
    语句。