1

日付フィールドから値を取得するテーブルが DB にあります。この日付値をカーソルに格納します。現在、日付値の形式は DD:MON:YY です。次に、to_char 関数を使用してこの日付を文字に変換し、時刻 00:00:00 を追加します。今、日付形式に変換しようとしましたが、タイムスタンプが追加されず、日付形式が指定したとおりではありません (形式は DB の日付フィールドの形式と同じです)。しかし、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

この問題を解決し、タイムスタンプに追加された文字を日付に変換するのを手伝ってくれる人はいますか?

4

1 に答える 1

2

DBMS_OUTPUTDISPLAYです。したがって、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 のみを表示すると、 v$parametersのNLS_DATE_FORMATに記載されている形式が表示されます。

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私の 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>
于 2015-01-27T06:11:56.600 に答える