Неверное преобразование даты в Unix - PullRequest
0 голосов
/ 01 сентября 2018

В sql dev преобразование даты корректно, но когда я помещаю его в сценарий unix , преобразование даты отличается.

TO_CHAR(TO_DATE(MAX(DATE), 'DD-MON-YYYY HH24:MI:SS'), 'YYYY-MM-DD"T"HH24:MI:SS')

Ввод : 01-SEP-2018 21: 30: 05
Результат в sql dev : 2018-09-01T21: 30: 05
Результат в Unix-скрипте : 0018-09-01T00: 00: 00

РЕДАКТИРОВАТЬ: Другие детали

Ниже update_date.sh в Unix. Это уже работает (временные таблицы удаляются / создаются со строками, которые мне нужны). Но содержит следующее: когда я пытаюсь конвертировать A.Date (что является датой), результат неверен.

0018-09-01T00:00:00. Год стал 0018, а Время стало 00:00:00.

#!/bin/sh

ACCOUNT=${APP_DB_USER}/${APP_DB_PASS}@${APP_DB_INST}

sqlplus -s $ACCOUNT << EOF > update_date.log

SET HEADING OFF;
WHENEVER SQLERROR CONTINUE;

SET ECHO ON;
SET SERVEROUTPUT ON SIZE 1000000;
SET TIME ON;
SET TIMING ON;

prompt TEMP TABLE: TMP_LOGS
        DROP TABLE TMP_LOGS;
        COMMIT;
        CREATE TABLE "TMP_MISMATCH_DATE"
                ("ID"       VARCHAR2(200 BYTE),
                "VALUE"     VARCHAR2(4000 BYTE),
                "COMPLETED" DATE,
                "REMARKS"   VARCHAR2(4000 BYTE));
        COMMIT;

prompt TEMP TABLE: TMP_MISMATCH_DATE

        DROP TABLE TMP_MISMATCH_DATE;
        COMMIT;
        CREATE TABLE TMP_MISMATCH_DATE AS
        SELECT /*+PARALLEL(A,8) PARALLEL(B,8) PARALLEL(C,8)*/
                A.ID,
                MAX(A.START_DATE),
                TO_CHAR(TO_DATE(MAX(A.DATE), 'DD-MON-YYYY HH24:MI:SS'), 'YYYY-MM-DD"T"HH24:MI:SS') as FIN_DATE,
                C.NAME,
                C.VALUE
        FROM TABLE1 A
                INNER JOIN temp_table B ON A.ID=B.ID
                INNER JOIN TABLE2 C ON A.ID=C.ID
        WHERE
                A.IND = 'N' AND A.STATUS = 'PR' AND
                C.NAME='SomeName' AND C.EXP_DATE IS NULL
                GROUP BY A.ID, C.NAME, C.VALUE;
        COMMIT;

prompt UPDATE Value 'SomeName' IN TABLE2

DECLARE
        CURSOR CUSTCUR IS
                 SELECT ID, START_DATE, FIN_DATE, NAME, VALUE
                 FROM TMP_MISMATCH_DATE
                 WHERE FIN_DATE IS NOT NULL;
BEGIN
        FOR CURREC IN CUSTCUR LOOP

                UPDATE TABLE2 agrprm
                SET agrprm.VALUE = curRec.FIN_DATE,
                    agrprm.update_date = SYSDATE
                WHERE
                        agrprm.ID = curRec.ID AND
                        agrprm.NAME = 'SomeName' AND
                        agrprm.EXP_DATE IS NULL
                ;
                COMMIT;

                INSERT INTO TMP_LOGS
                        VALUES( CURREC.ID,
                                CURREC.VALUES,
                                SYSDATE, 'NEW_VALUE');
                COMMIT;
        END LOOP;
        COMMIT;
END;
/
EXIT;
EOF

1 Ответ

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

Будьте внимательны, в приведенном выше коде есть проблемы:

  • Поле DATE, которое вы вызываете в MAX(A.DATE), не существует. Я думаю, что вы имели в виду COMPLETED вместо
  • Поле VALUES, которое вы вызываете в CURREC.VALUES, также не существует. может быть VALUE?

Итак, решение, которое вам нужно:

Вместо преобразования даты в varchar, затем вернуться к дате с помощью

TO_CHAR(
   TO_DATE(
       MAX(DATE)
       , 'DD-MON-YYYY HH24:MI:SS')
 , 'YYYY-MM-DD"T"HH24:MI:SS')

Вы можете просто продолжить с

TO_CHAR(
      MAX(DATE)
    , 'YYYY-MM-DD"T"HH24:MI:SS')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...