Oracle изменение формата sysdate с dd / mm / yy на ddmmyy - PullRequest
0 голосов
/ 07 августа 2020

Длина данных в нашей производственной БД, тип данных DATE, равна 7, функция sysdate возвращает 8 символов (дд / мм / гг). Есть ли способ удалить '/' и заполнить только 'ddmmyy'.

Пробовал, но не повезло.

  INSERT INTO TESTER(tablename,columnname,defaultdate,prime_number) VALUES ('tabL7845','field894',REPLACE(SYSDATE,'/',''),105);

  INSERT INTO TESTER(tablename,columnname,defaultdate,prime_number) VALUES ('ta68888','fiG987',TO_CHAR(sysdate,'MMDDYY'),180);

  INSERT INTO TESTER(tablename,columnname,defaultdate,prime_number) VALUES ('tab345','field464',TRIM(BOTH '/' FROM SYSDATE),65);

Строка вставляется, но в таблице я мог найти то же самое формат sysdate,

for eg ) 07/08/20

How can i populate as 070820 

Код запуска:

 SET SERVEROUTPUT ON;
 CREATE OR REPLACE TRIGGER def_trig 
 BEFORE INSERT OR UPDATE OF datedef ON Test 
 REFERENCING OLD AS O NEW AS N 
 FOR EACH ROW 
 DECLARE
   V_DATA_LENGTH NUMBER;
   V_DATA_TYPE VARCHAR2(15);
 BEGIN
 SELECT DATA_LENGTH,DATA_TYPE 
 INTO V_DATA_LENGTH,V_DATA_TYPE 
 FROM all_tab_columns 
 WHERE table_name = :n.tablename 
 AND column_name =:n.columnname
 IF INSERTING THEN
        IF v_data_type = 'DATE' THEN
            IF length(:n.datedef) > V_DATA_LENGTH THEN
                RAISE_APPLICATION_ERROR(-20001,'DATE FIELD LENGTH IS MORE THAN THE CORESPONDING COLUMN DATA LENGTH');
            END IF;
        ELSE
                DBMS_OUTPUT.PUT_LINE('INSERT IS SUCCESSFUL');
        END IF;
END if;
END;
/

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Даты в Oracle не имеют внутреннего форматирования текста; они хранятся как двоичные. Если вы хотите просмотреть a SYSDATE значение в определенном текстовом формате, используйте TO_CHAR с соответствующей маской формата:

INSERT INTO TESTER (tablename, columnname, defaultdate, prime_number)
VALUES ('ta68888', 'fiG987', sysdate, 180);   -- just insert plain SYSDATE here

SELECT
    tablename,
    columnname,
    TO_CHAR(defaultdate, 'DDMMYY'),           -- then view SYSDATE however you want
    prime_number
FROM TESTER;

Вот результат вышеприведенного запроса :

screen capture from demo below

Демо

0 голосов
/ 07 августа 2020

Внутренние даты хранятся как структура из 7 целых чисел размером 1 байт, отсюда и длина 7. Из этой структуры можно отобразить любой допустимый формат без изменения данных . Чтобы увидеть это, выберите один и тот же столбец с несколькими форматами. Например:

alter session st nls_date_format = 'hh24:mi:ss  dd-Mon-yyyy';
select defaultdate 
  from teaster  
 where defaultdate is not null 
   and row_num<2;

alter session set nls_date_format = 'Dy dd-Mon-yyyy @ hh24:mi:ss' ;
select defaultdate 
  from teaster  
 where defaultdate is not null 
   and row_num<2; 

Чтобы получить представление о внутреннем формате, запустите:

select defaultdate, dump(defaultdate) from teaster;

Это покажет вам дату по умолчанию (интерпретируемую как указано nls_date_format) и проблеск внутренняя структура.

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