ORA-01861: литерал не соответствует строке формата для оператора case в oracle - PullRequest
0 голосов
/ 07 сентября 2018

, пожалуйста, помогите мне исправить эту ошибку. Я получаю эту ошибку постоянно

ORA-01861: литерал не соответствует строке формата для оператора case в оракул

SELECT activity_made,
       (CASE
            WHEN (TO_DATE(activity_made, 'DD-Mon-YYYY')) = TRUNC(SYSDATE) THEN TO_CHAR(activity_made, 'hh12:mi PM')
            WHEN TRUNC(TO_DATE(activity_made, 'MM-DD-YYYY')) BETWEEN TRUNC(SYSDATE, 'yy') AND TRUNC(SYSDATE - 1) THEN TO_CHAR(activity_made, 'Mon dd')
            ELSE TO_CHAR(TO_DATE(activity_made, 'MM/DD/YYYY'), 'mm/dd/yyyy')
        END)
           AS actmode
  FROM (SELECT (CASE
                    WHEN (SELECT COUNT(*)
                            FROM sfa_activity sa
                           WHERE     sa.companyid = opp.companyid
                                 AND sa.opptyid = opp.opptyid
                                 AND sa.TYPE = 'NOTE') > 0
                    THEN
                        (SELECT NVL(MAX(TO_CHAR(sa.updat, 'YYYY/MM/DD HH24:MI:SS')), '0000/00/00 00:00:00')
                           FROM sfa_activity sa
                          WHERE     sa.companyid = opp.companyid
                                AND sa.opptyid = opp.opptyid
                                AND sa.TYPE = 'NOTE')
                    ELSE
                        (SELECT NVL(MAX(TO_CHAR(sa.updat, 'YYYY/MM/DD HH24:MI:SS')), '1001/01/01 01:01:01')
                           /*ELSE (SELECT (MAX(TO_CHAR(sa.updat,'YYYY/MM/DD HH24:MI:SS')))*/
                           FROM sfa_activity sa
                          WHERE     sa.companyid = opp.companyid
                                AND sa.opptyid = opp.opptyid
                                AND sa.TYPE <> 'NOTE')
                END)
                   AS activity_made
          FROM sfa_opportunities opp
         WHERE companyid = 1192)

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Я бы порекомендовал вам переписать ваш запрос примерно так:

SELECT sa.updat activity_made
     , CASE WHEN TRUNC(sa.updat) = TRUNC(SYSDATE) THEN TO_CHAR(sa.updat, 'hh12:mi PM')
            WHEN sa.updat > TRUNC(SYSDATE,'yy') THEN TO_CHAR(sa.updat, 'Mon dd')
            ELSE TO_CHAR(sa.updat, 'mm/dd/yyyy')
       END actmode
  FROM sfa_activity sa
 WHERE (sa.companyid, sa.opptyid) IN (SELECT opp.companyid, opp.opptyid 
                                        FROM sfa_opportunities opp
                                       WHERE companyid = 1192)
 ORDER BY CASE WHEN sa.TYPE = 'NOTE' THEN 0 ELSE 1 END, sa.updat DESC
 FETCH first ROW ONLY 

Ваша версия имеет некоторые недостатки:

  • ненужные преобразования типов
  • много выборок на одной и той же таблице, которые не нужны
  • возможны также проблемы с производительностью

Обработка, когда никакие действия не выполняются, должна производиться снаружи, а не во внутреннем выборе. (Облегчает обслуживание.)

0 голосов
/ 10 сентября 2018

Спасибо всем, я нашел решение, применив кейс внутри action_made

/* Formatted on 2018/09/10 14:15 (Formatter Plus v4.8.5) */
SELECT activity_made,
       (CASE
           WHEN activity_made = '0000/00/00 00:00:00'
              THEN NULL
           ELSE activity_made
        END
       ) AS actmode
  FROM (SELECT (CASE
                   WHEN (SELECT COUNT (*)
                           FROM sfa_activity sa
                          WHERE sa.companyid = opp.companyid
                            AND sa.opptyid = opp.opptyid
                            AND sa.TYPE = 'NOTE') > 0
                      THEN (SELECT NVL
                                      (MAX
                                          (TO_CHAR
                                              (CASE
                                                  WHEN TRUNC (sa.updat) =
                                                               TRUNC (SYSDATE)
                                                     THEN TO_CHAR
                                                                 (sa.updat,
                                                                  'hh12:mi PM'
                                                                 )
                                                  WHEN TRUNC (sa.updat)
                                                         BETWEEN TRUNC
                                                                     (SYSDATE,
                                                                      'yy'
                                                                     )
                                                             AND TRUNC
                                                                    (  SYSDATE
                                                                     - 1
                                                                    )
                                                     THEN TO_CHAR (sa.updat,
                                                                   'Mon dd'
                                                                  )
                                                  ELSE TO_CHAR (sa.updat,
                                                                'DD/MM/YYYY'
                                                               )
                                               END
                                              )
                                          ),
                                       '0000/00/00 00:00:00'
                                      )
                              FROM sfa_activity sa
                             WHERE sa.companyid = opp.companyid
                               AND sa.opptyid = opp.opptyid
                               AND sa.TYPE = 'NOTE')
                   ELSE (SELECT NVL
                                   (MAX
                                       (TO_CHAR
                                           (CASE
                                               WHEN TRUNC (sa.updat) =
                                                               TRUNC (SYSDATE)
                                                  THEN TO_CHAR (sa.updat,
                                                                'hh12:mi PM'
                                                               )
                                               WHEN TRUNC (sa.updat)
                                                      BETWEEN TRUNC (SYSDATE,
                                                                     'yy'
                                                                    )
                                                          AND TRUNC (  SYSDATE
                                                                     - 1
                                                                    )
                                                  THEN TO_CHAR (sa.updat,
                                                                'Mon dd'
                                                               )
                                               ELSE TO_CHAR (sa.updat,
                                                             'DD/MM/YYYY'
                                                            )
                                            END
                                           )
                                       ),
                                    '0000/00/00 00:00:00'
                                   )
                           /*ELSE (SELECT (MAX(TO_CHAR(sa.updat,'YYYY/MM/DD HH24:MI:SS')))*/
                         FROM   sfa_activity sa
                          WHERE sa.companyid = opp.companyid
                            AND sa.opptyid = opp.opptyid
                            AND sa.TYPE <> 'NOTE')
                END
               ) AS activity_made
          FROM sfa_opportunities opp
         WHERE companyid = 1192)
0 голосов
/ 07 сентября 2018

Кажется, что ACTIVITY_MADE в формате yyyy/mm/dd hh24:mi:ss (как предполагает встроенное представление).Если упростить, ваш запрос выглядит как

select to_date(activity_made, ...) --> should use the same format as below, in an inline view
from (select activity_made         -->TO_CHAR(sa.updat, 'YYYY/MM/DD HH24:MI:SS')
      from sfa_opportunities) 

Итак: если вы использовали эту маску формата для activity_made, вы должны использовать ее для TO_CHAR в main SELECT.Тем не менее, вы использовали

  • дд-мон-гггг
  • мм-дд-гггг
  • мм / дд / гггг

Switchдо yyyy/mm/dd hh24:mi:ss в CASE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...