sql >> Databáze >  >> RDS >> Oracle

Vytvořte funkci pro vrácení aktuálního data a času v oracle

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>


  1. MySQL vrátí první řádek spojené tabulky

  2. MySQL Oddělení řetězců operátorem čárkou

  3. Zobrazte obrázek uložený v databázi MySql ve formátu BLOB pomocí c#

  4. Chyba při generování tabulky MySQL při přejmenování