Добавление функции HH:MI:SS к to_date
У меня есть таблица в БД, из которой я беру значения из поля даты. Я храню это значение даты в курсоре. в настоящее время значение даты имеет формат DD:MON:YY. Теперь я конвертирую эту дату в символ, используя функцию to_char, чтобы добавить к ней время 00:00:00. Теперь я попытался преобразовать обратно в формат даты, но отметка времени не добавлена, и формат даты не соответствует указанному (формат совпадает с форматом поля даты в БД). Но функция to_char возвращает правильный формат, как я дали.
Вот некоторые фрагменты кода:
Инициализировал курсор как
cursor cur is
select to_char(STV_FROM_DATE,'DD:MON:YYYY:')STV_FROM_DATE :---from a table in DB
cur1 cur%rowtype;
begin
open cur;
loop
fetch cur into cur1;
dbms_output.put_line(cur_1.STV_FROM_DATE);
Это дает значение правильно как:
01:JAN:2000:
01:JAN:2000:
01:JAN:2000:
01:JAN:2000:
Теперь я добавил к этому метку времени 00:00:00 и выполнил операцию to_date следующим образом:
STV_FROM_DATE_BC := cur_1.STV_FROM_DATE;
STV_FROM_DATEBCKUP:=to_date(STV_FROM_DATE_BC,'DD:MM:YY:HH24:MI:SS');
dbms_output.put_line(STV_FROM_DATEBCKUP);
Полученный результат:
01-JAN-00
01-JAN-00
01-JAN-00
Может ли кто-нибудь помочь мне решить эту проблему и преобразовать добавленный символ времени в дату?
1 ответ
DBMS_OUTPUT должен отображать. Итак, чтобы отобразить DATE, вам нужно TO_CHAR.
STV_FROM_DATEBCKUP: = to_date (STV_FROM_DATE_BC, 'DD: MM: YY: HH24: MI: SS'); dbms_output.put_line (STV_FROM_DATEBCKUP);
Никогда не используйте YY, всегда указывайте 4 цифры YYYY за полный год. Вы не хотите вводить ошибку Y2K снова. Выше вы пытаетесь отобразить значение даты, но вы не упомянули модель формата, которую вы хотите отобразить. Так что просто используйте TO_CHAR вместе с правильной форматной моделью.
Причина Без предоставления надлежащей модели формата ваш клиент будет просто отображаться в соответствии с вашими настройками NLS для конкретной локали. Например, если я просто отображаю sysdate, я бы увидел формат, упомянутый в моем NLS_DATE_FORMAT в параметрах v$.
SQL> select parameter, value from v$nls_parameters where parameter='NLS_DATE_FORMAT';
PARAMETER VALUE
-------------------- --------------------
NLS_DATE_FORMAT DD-MON-RR
SQL> select sysdate from dual;
SYSDATE
---------
27-JAN-15
SQL>
Итак, я получил 27-JAN-15
как SYSDATE, так как мой NLS_DATE_FORMAT DD-MON-RR
, Вы можете установить его на системном уровне или на уровне сеанса.
SQL> alter session set NLS_DATE_FORMAT='DD:MM:YYYY:HH24:MI:SS';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
27:01:2015:11:54:07
SQL>
Таким образом, вы можете установить NLS_DATE_FORMAT
установить модель формата, которая вам подходит. Давайте посмотрим на тестовый пример -
SQL> set serveroutput on
SQL> DECLARE
2 STV_FROM_DATE_BC VARCHAR2(20);
3 STV_FROM_DATEBCKUP DATE;
4 BEGIN
5 STV_FROM_DATEBCKUP:= NULL;
6 STV_FROM_DATE_BC :='01:JAN:2000:';
7 STV_FROM_DATE_BC :=STV_FROM_DATE_BC||'00:00:00';
8 dbms_output.put_line('Input date literal = '||STV_FROM_DATE_BC);
9 STV_FROM_DATEBCKUP:=to_date(STV_FROM_DATE_BC,'DD:MON:YYYY:HH24:MI:SS');
10 dbms_output.put_line('Date without format model = '||STV_FROM_DATEBCKUP);
11 dbms_output.put_line('Date with proper format model = '||TO_CHAR(STV_FROM_DATEBCKUP,'DD:MM:YYYY:HH24:MI:SS'));
12 END;
13 /
Input date literal = 01:JAN:2000:00:00:00
Date without format model = 01-JAN-00
Date with proper format model = 01:01:2000:00:00:00
PL/SQL procedure successfully completed.
SQL>