2

私はこの質問を見た ので、この質問に関して1つ疑問があります.次のクエリで同じ日付で異なる結果が得られます.

SELECT TO_CHAR(to_date(sysdate, 'DD-MON-yy'), 'DAY'),
  TO_CHAR(to_date(sysdate, 'DD-MON-yyyy'), 'DAY'),
  TO_CHAR(to_date(sysdate, 'DD-MON-rr'), 'DAY'),
  TO_CHAR(to_date(sysdate, 'DD-MON-rrrr'), 'DAY')
FROM dual;

列ごとに出力:

TUESDAY SUNDAY TUESDAY TUESDAY

助けてください、よろしくお願いします。

編集

以下に示す日を見つけるための日付を渡す簡単な手順を書きました。

SET serveroutput ON;
CREATE OR REPLACE
    PROCEDURE simple_test
      (
        date_in         IN VARCHAR2)
                        IS
      v_date DATE       := to_date(date_in,'dd-mon-yyyy');
      v_day VARCHAR2(10):=TO_CHAR(v_date,'day');
    BEGIN
       dbms_output.put_line('the day of given date is '||v_day);
    END;
    /

EXEC simple_test(sysdate);

anonymous block completed
the day of given date is sunday  

EXEC simple_test('01-JAN-2013');

anonymous block completed
the day of given date is tuesday  

なぜこれが起こったのですか?

4

2 に答える 2

4

異なる結果が得られる理由を説明したいと思います。

このsqlfiddleを参照してください

すでに述べたように、sysdate はDATE型と見なされ、暗黙的な変換を行っています。

select to_date(sysdate, format) from dual;

to_date の最初のパラメーターは varchar 型である必要があるため、システムは次のようにします。

select to_date(to_char(sysdate), format) from dual;

暗黙の日付形式が であるため'DD-MON-YY'、クエリは次のようになります。

SELECT TO_CHAR(to_date('01-JAN-13', 'DD-MON-yy'), 'DAY'),
  TO_CHAR(to_date('01-JAN-13', 'DD-MON-yyyy'), 'DAY'),
  TO_CHAR(to_date('01-JAN-13', 'DD-MON-rr'), 'DAY'),
  TO_CHAR(to_date('01-JAN-13', 'DD-MON-rrrr'), 'DAY')
FROM dual;

2 番目の to_dateyyyyは、完全な千年形式であるため、'01-JAN-0013' に移動します。これは 13AD であり、おそらく SUNDAY です:)

于 2013-01-01T09:26:09.710 に答える
1

SYSDATE はすでに日付です。したがって、次のように書くと:

TO_DATE(SYSDATE, 'DD-MON-yy')

日付から文字列への暗黙的な変換と、文字列から日付への明示的な変換の 2 つの変換を既に行っています。日付形式を指定できないため、暗黙的なものに問題があります。(代わりに、セッションの現在の設定から取得されます。)

したがって、解決策は、不要な変換を取り除き、次のように書くことです。

SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;
于 2013-01-01T09:00:45.010 に答える