-1

我有这个关于生产的查询,直到昨天还没有问题:

 SELECT E.ID       
    FROM EXAM_STUD_ENTERANCE E,
         EXAM_REGISTRATION R
   WHERE     E.EXAM_REG_ID = R.ID
         AND E.USER_NAME ='user'          
         AND E.BLOCK = 1
         AND E.STATUS = 1
      AND TO_DATE (TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS'),
                'DD/MM/YYYY HH24:MI:SS') >
            TO_DATE (
                  TO_CHAR (R.EXAM_DATE, 'DD/MM/YYYY')
               || ' ' || R.EXAM_START_TIME
              ,
               'DD/MM/YYYY HH24:MI:SS')

   AND TO_DATE (TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS'),
                'DD/MM/YYYY HH24:MI:SS') <
            TO_DATE (
                  TO_CHAR (R.EXAM_DATE, 'DD/MM/YYYY')
               || ' ' || R.EXAM_END_TIME
              ,
               'DD/MM/YYYY HH24:MI:SS');

但现在我收到一个错误

ORA-01858: 在需要数字的地方发现了一个非数字字符

EXAM_START_TIME 和 EXAM_END_TIME 列的类型为 NVARCHAR2(100),并存储类似 '16:40' 的数据;EXAM_DATE 是日期

4

1 回答 1

2

昨天有人在其中一个时间列中插入了一个错误的值

做一个

SELECT * FROM EDUMAN_EXAM.EXAM_REGISTRATION 
WHERE 
  NOT( 
    REGEXP_LIKE(EXAM_START_TIME, '^\d\d:\d\d:\d\d$') AND
    REGEXP_LIKE(EXAM_END_TIME, '^\d\d:\d\d:\d\d$')
  )

找到坏数据,并将其删除

注意:您发布了一个指示时间列存储的 sql,hh:mm:ss并且您说“它正在工作”,但随后您声称时间列不存储秒数。如果他们确实存储秒数,则使用上述查询。如果他们不存储秒数,请将正则表达式模式减少到\d\d:\d\d

作为旁注,您永远不应该决定将此时间数据存储为字符串。保存 EXAM_START_DATE 的 DATETIME 可以轻松保存时间,如果您只想要没有时间部分的 DATE,您可以TRUNC(some_datetime)删除时间组件

将数据存储在正确类型的列中,您将不会遇到此问题,并且您不必date -> string -> concatenate -> parse在数千条记录中进入这个可笑的过程

于 2018-11-27T08:53:03.093 回答