2015-01-27 2 views
1

У меня есть таблица в БД, из которой я беру значения из поля даты. Я сохраняю это значение даты в курсоре. в настоящее время значение даты имеет формат DD: MON: YY. Теперь я конвертирую эту дату в символ, используя функцию to_char, чтобы добавить к ней 00:00:00. теперь я попытался преобразовать обратно в формат даты, но временная метка не добавлена, а формат даты не такой, как я дал (формат такой же, как и в поле даты в БД). но функция to_char возвращает правильный формат, поскольку я дали.Добавление функции HH: MI: SS to_date

Некоторые фрагменты кода заключаются в следующем:

Initialized курсор в

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 

Может кто-нибудь помочь мне решить эту проблему и преобразовать Отметка времени добавляется символ на сегодняшний день?

+0

вы должны снова использовать 'to_char' функцию – Exhausted

+0

Спасибо Сать за быстрый ответ. –

+0

Но проблема в том, что я снова должен обновить это новое добавленное значение в БД в поле даты. –

ответ

2

DBMS_OUTPUT является DISPLAY. поэтому, чтобы отобразить DATE, вам необходимо TO_CHAR.

STV_FROM_DATEBCKUP: = to_date (STV_FROM_DATE_BC, 'ДД: ММ: ГГ: 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> 
+0

Спасибо, Лалит. Кажется, проблема решена. –

+0

Спасибо за отзыв. Пожалуйста, отметьте его, если он решил вашу проблему. –

+1

Никогда не говорите * никогда не используйте YY *. –

Смежные вопросы