CURRENT_DATE
mengembalikan tanggal dan waktu sesi. SYSDATE
mengembalikan tanggal dan waktu database. Nilai ini mungkin berbeda karena kami dapat mengubah zona waktu sesi menggunakan ALTER SESSION
. Anda mungkin harus menggunakan SYSDATE
karena mengembalikan nilai yang konsisten, meskipun tanpa mengetahui konteks bisnis Anda sulit untuk memastikannya.
Dari pertanyaan Anda, saya curiga Anda tidak menyadari bahwa kolom pseudo tanggal Oracle menyertakan elemen waktu. Coba ini:
alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss'
/
select current_date from dual
/
select sysdate from dual
/
Tidak ada gunanya membungkus salah satu kolom semu itu dalam fungsi yang ditentukan pengguna Anda sendiri. Satu kali saya benar-benar mempertimbangkannya adalah untuk mempermudah memasukkan waktu ke dalam beberapa unit test otomatis. Tapi saya tidak pernah meyakinkan diri sendiri bahwa fasilitas ini akan membenarkan tidak menggunakan pendekatan standar.
edit
Solusi dalam jawaban yang diterima berfungsi tetapi memiliki banyak bagasi yang tidak perlu. Semua PL/SQL tambahan itu berjalan 2-3 kali lebih lambat daripada select sysdate from dual;
. Memang benar bahwa ini adalah perbedaan yang sangat kecil secara absolut - milidetik, jika itu. Tetapi dalam sistem yang sibuk dengan banyak panggilan ke getSysdate()
semua milidetik itu bisa menambah banyak waktu. Solusi yang lebih baik adalah mengganti semua kode itu dengan return sysdate
plain; Ini sedikit lebih lambat daripada memanggil sysdate
langsung tetapi hanya sedikit.
Memperluas komentar dpbradley, saya telah membuat fungsi yang memungkinkan kita untuk mengganti waktu jam yang berbeda dari database, untuk keperluan pengujian. Saya menyimpan waktu alternatif saya di ruang nama CLIENT_INFO dalam konteks default; jika saya menerapkan ini dalam sistem produksi, saya akan membangun konteks khusus yang ditentukan pengguna untuknya.
Jadi, inilah pendapat saya tentang getSysdate()
fungsi...
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>
Inilah cara kami mengatur waktu alternatif...
SQL> exec dbms_application_info.set_client_info('01-DEC-2010 12:12:12')
PL/SQL procedure successfully completed.
Jika tidak ada parameter yang dilewatkan, ia mengembalikan sysdate
(opsi default dan pilihan).
SQL> select getsysdate from dual
2 /
GETSYSDATE
-----------------
05-JAN-2010 16:25
SQL>
Jika kita melewati ruang nama konteks saat kita memanggil fungsi, kita mendapatkan waktu alternatif....
SQL> select mygetsysdate('CLIENT_INFO') from dual
2 /
MYGETSYSDATE('CLI
-----------------
01-DEC-2010 12:12
SQL>