CURRENT_DATE
セッションの日付と時刻を返します。 SYSDATE
データベースの日付と時刻を返します。 ALTER SESSION
を使用してセッションのタイムゾーンを変更できるため、これらの値は異なる場合があります。 。おそらくSYSDATE
を使用する必要があります 一貫した値を返すためですが、ビジネスコンテキストを知らなければ、確実なことは困難です。
あなたの質問から、Oracleの日付の疑似列に時間要素が含まれていることに気付いていないのではないかと思います。これを試してください:
alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss'
/
select current_date from dual
/
select sysdate from dual
/
これらの疑似列の1つを独自のユーザー定義関数でラップしても、あまり意味がありません。私が真剣に考えたのは、自動化された単体テストに時間を注入しやすくすることでした。しかし、私はこの施設が標準的なアプローチを使用しないことを正当化するだろうとは決して確信していませんでした。
編集
受け入れられた回答の解決策は機能しますが、不要な荷物がたくさんあります。追加のPL/SQLはすべて、ストレートのselect sysdate from dual;
よりも2〜3倍遅く実行されます。 。確かに、これらは絶対値で非常に小さな違いです。その場合、ミリ秒です。しかし、getSysdate()
への呼び出しが多い忙しいシステムでは これらすべてのミリ秒は、合計して大きな時間になる可能性があります。より良い解決策は、そのすべてのコードをプレーンなreturn sysdate
に置き換えることです。;これは、sysdate
を呼び出すよりも少し遅くなります 直接ですが少しだけです。
dpbradleyのコメントを拡張して、テストの目的で、データベースとは異なる時刻を置き換えることができる関数をノックアップしました。代替日時をデフォルトのコンテキストのCLIENT_INFO名前空間に保存しています。これを本番システムに実装する場合は、専用のユーザー定義コンテキストを構築します。
これがgetSysdate()
に関する私の見解です 機能...
SQL> create or replace function myGetSysdate
2 ( p_alt_date in varchar2 := null )
3 return date is
4 begin
5 if p_alt_date is null then
6 return sysdate;
7 else
8 return to_date(sys_context('userenv', p_alt_date)
9 , 'dd-mon-yyyy hh24:mi:ss');
10 end if;
11 end;
12 /
Function created.
SQL>
代替日時を設定する方法は次のとおりです...
SQL> exec dbms_application_info.set_client_info('01-DEC-2010 12:12:12')
PL/SQL procedure successfully completed.
パラメータが渡されない場合は、sysdate
を返します。 (デフォルトの優先オプション)。
SQL> select getsysdate from dual
2 /
GETSYSDATE
-----------------
05-JAN-2010 16:25
SQL>
関数を呼び出すときにコンテキスト名前空間を渡すと、代替日時が取得されます。...
SQL> select mygetsysdate('CLIENT_INFO') from dual
2 /
MYGETSYSDATE('CLI
-----------------
01-DEC-2010 12:12
SQL>