0

特定の日のデータを取得する必要があるという要件があります。したがって、私の理想的な開始日は 2013-06-07 00:00:01 AM で、終了日は 2013-06-07 23:59:59 AM です。

したがって、私はこのコードを書きました。

create or replace
PROCEDURE checkChanges

IS

vc_startDate timestamp;
vc_endDate timestamp;
begin 

    vc_startDate :=to_timestamp(TO_CHAR(trunc(systimestamp)-40+((24*60*60)-1)/(24*60*60),'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'); 
    vc_endDate :=to_timestamp(TO_CHAR(trunc(systimestamp)+1/(24*60*60),'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss');

    Dbms_Output.Put_Line('vc_startDate ' ||vc_startDate);
    Dbms_Output.Put_Line('vc_endDate ' ||vc_endDate);

    SELECT EMAIL_ADRESS FROM SOMETABLE A,B
    AND A.CREATE_TS BETWEEN vc_startDate AND vc_endDate ORDER BY B.START_DT;

end checkChanges;

しかし、私が取得している開始日と終了日はかなり異なります。

開始日:07-JUN-13 12.00.01.000000 AM

終了日: 07-JUN-13 11.59.59.000000 PM

4

1 に答える 1

2

これを行う簡単な方法を次に示します。

DECLARE
   v_start   TIMESTAMP;
   v_end     TIMESTAMP;
BEGIN
   v_start := TRUNC (SYSTIMESTAMP) + NUMTODSINTERVAL (1, 'second'); --truncate the timestamp and add one second
   DBMS_OUTPUT.PUT_LINE (TO_CHAR (v_start, 'yyyy-mm-dd hh24:mi:ss'));

/*alternate way
v_start := TRUNC (SYSTIMESTAMP) + INTERVAL '0 0:0:1' DAY TO SECOND; --truncate the timestamp and add one second
DBMS_OUTPUT.PUT_LINE (TO_CHAR (v_start, 'yyyy-mm-dd hh24:mi:ss AM'));*/

   v_end :=
        TRUNC (SYSTIMESTAMP)                         --trunacate the timestamp
      + INTERVAL '1 0:0:0.0' DAY TO SECOND                         --add a day
      - NUMTODSINTERVAL (1, 'second');                    --substract a second
   DBMS_OUTPUT.PUT_LINE (TO_CHAR (v_end, 'yyyy-mm-dd hh24:mi:ss'));

/*alternate way
v_end := TRUNC (SYSTIMESTAMP)                     --trunacate the timestamp
                             + INTERVAL '0 23:59:59' DAY TO SECOND; --add hours, mins, s
DBMS_OUTPUT.PUT_LINE (TO_CHAR (v_end, 'yyyy-mm-dd hh24:mi:ss AM'));*/
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;

出力:

2013-06-07 00:00:01 AM
2013-06-07 23:59:59 PM

アップデート

また、変換せずに値を出力したto_charところ、得られたものと同様に表示されました。

DBMS_OUTPUT.PUT_LINE (v_start);
DBMS_OUTPUT.PUT_LINE (v_end);

出力:

07-JUN-13 12.00.01.000000 AM
07-JUN-13 11.59.59.000000 PM

だから、あなたがしていることは正しいようです(しかし、少し複雑です)。タイムスタンプを表示すると、NLS パラメータに従って表示されます。を使用して確認する

SELECT *
  FROM nls_session_parameters
 WHERE parameter = 'NLS_TIMESTAMP_FORMAT';

これで返ってくると思いますDD-MON-RR HH.MI.SSXFF AM

どのように表示されるかは気にしないでください。日付/タイムスタンプ変数には形式がありません。印刷したいときだけ重要です。to_char 関数を使用しない場合は、NLS パラメータで定義されている書式マスクが使用されます。オーバーライドする場合は、to_char 関数を使用してマスクを指定します。ただし、クエリで使用すると、正しい値になります。

于 2013-06-07T15:58:53.040 に答える