CURRENT_DATE
geeft de datum en tijd van de sessie terug. SYSDATE
geeft de datum en tijd van de database terug. Deze waarden kunnen verschillen omdat we de tijdzone van onze sessie kunnen wijzigen met ALTER SESSION
. Je zou waarschijnlijk SYSDATE
moeten gebruiken omdat het een consistente waarde oplevert, hoewel het moeilijk is om zeker te zijn zonder uw zakelijke context te kennen.
Uit uw vraag vermoed ik dat u zich niet realiseert dat pseudokolommen voor Oracle-datums een tijdselement bevatten. Probeer dit:
alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss'
/
select current_date from dual
/
select sysdate from dual
/
Het heeft niet veel zin om een van die pseudo-kolommen in uw eigen door de gebruiker gedefinieerde functie te wikkelen. De enige keer dat ik het serieus overwoog, was om het gemakkelijker te maken om tijden te injecteren in een aantal geautomatiseerde unit-tests. Maar ik heb mezelf er nooit van overtuigd dat deze faciliteit het niet zou rechtvaardigen om de standaardbenadering te gebruiken.
bewerken
De oplossing in het geaccepteerde antwoord werkt maar heeft veel onnodige bagage. Al die extra PL/SQL werkt 2-3 keer langzamer dan een gewone select sysdate from dual;
. Het is waar dat dit zeer kleine verschillen zijn in absolute termen - milliseconden, als dat zo is. Maar in een druk systeem met veel oproepen naar getSysdate()
al die milliseconden kunnen optellen tot een groot deel van de tijd. Een betere oplossing zou zijn om al die code te vervangen door een gewone return sysdate
; Dit is iets langzamer dan het aanroepen van sysdate
rechtstreeks, maar slechts met een klein beetje.
Voortbouwend op de opmerking van dpbradley, heb ik een functie gemaakt waarmee we een andere kloktijd uit de database kunnen vervangen, voor testdoeleinden. Ik sla mijn alternatieve datetime op in de CLIENT_INFO-naamruimte in de standaardcontext; als ik dit in een productiesysteem zou implementeren, zou ik er een speciale, door de gebruiker gedefinieerde context voor bouwen.
Dus hier is mijn mening over de getSysdate()
functie...
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>
Hier is hoe we de alternatieve datum en tijd instellen...
SQL> exec dbms_application_info.set_client_info('01-DEC-2010 12:12:12')
PL/SQL procedure successfully completed.
Als er geen parameter wordt doorgegeven, retourneert het sysdate
(de standaard- en voorkeursoptie).
SQL> select getsysdate from dual
2 /
GETSYSDATE
-----------------
05-JAN-2010 16:25
SQL>
Als we een contextnaamruimte doorgeven wanneer we de functie aanroepen, krijgen we de alternatieve datetime....
SQL> select mygetsysdate('CLIENT_INFO') from dual
2 /
MYGETSYSDATE('CLI
-----------------
01-DEC-2010 12:12
SQL>