CURRENT_DATE
vrátí datum a čas relace. SYSDATE
vrátí datum a čas databáze. Tyto hodnoty se mohou lišit, protože časové pásmo naší relace můžeme změnit pomocí ALTER SESSION
. Pravděpodobně byste měli používat SYSDATE
protože vrací konzistentní hodnotu, ačkoli bez znalosti vašeho obchodního kontextu je těžké si být jistý.
Z vaší otázky mám podezření, že si neuvědomujete, že pseudosloupce data Oracle obsahují prvek času. Zkuste toto:
alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss'
/
select current_date from dual
/
select sysdate from dual
/
Nemá smysl zabalovat jeden z těchto pseudosloupců do vlastní uživatelsky definované funkce. Jednou jsem vážně uvažoval o tom, že jsem usnadnil vkládání časů do některých automatizovaných jednotkových testů. Ale nikdy jsem se nepřesvědčil, že toto zařízení by ospravedlnilo nepoužívat standardní přístup.
upravit
Řešení v přijaté odpovědi funguje, ale má spoustu zbytečných zavazadel. Všechny ty další PL/SQL běží 2-3krát pomaleji než přímé select sysdate from dual;
. Je pravda, že jde o velmi malé rozdíly v absolutních hodnotách - milisekundy, pokud ano. Ale v zaneprázdněném systému se spoustou volání getSysdate()
všechny ty milisekundy by mohly dát dohromady velký kus času. Lepším řešením by bylo nahradit veškerý tento kód obyčejným return sysdate
; To je o něco pomalejší než volání sysdate
přímo, ale jen trochu.
Rozšířením komentáře dpbradleyho jsem srazil funkci, která nám umožňuje nahradit jiný čas z databáze pro účely testování. Ukládám svůj alternativní datum a čas do jmenného prostoru CLIENT_INFO ve výchozím kontextu; pokud bych to implementoval v produkčním systému, vytvořil bych pro to vyhrazený uživatelsky definovaný kontext.
Zde je můj názor na getSysdate()
funkce...
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>
Zde je návod, jak nastavujeme alternativní datum a čas...
SQL> exec dbms_application_info.set_client_info('01-DEC-2010 12:12:12')
PL/SQL procedure successfully completed.
Pokud není předán žádný parametr, vrátí sysdate
(výchozí a preferovaná možnost).
SQL> select getsysdate from dual
2 /
GETSYSDATE
-----------------
05-JAN-2010 16:25
SQL>
Pokud předáme kontextový jmenný prostor, když voláme funkci, získáme alternativní datum a čas....
SQL> select mygetsysdate('CLIENT_INFO') from dual
2 /
MYGETSYSDATE('CLI
-----------------
01-DEC-2010 12:12
SQL>