Oracle
 sql >> Database >  >> RDS >> Oracle

Crea una funzione per restituire la data e l'ora correnti in Oracle

CURRENT_DATE restituisce la data e l'ora della sessione. SYSDATE restituisce la data e l'ora del database. Questi valori potrebbero essere diversi perché possiamo modificare il fuso orario della nostra sessione utilizzando ALTER SESSION . Probabilmente dovresti usare SYSDATE perché restituisce un valore consistente, anche se senza conoscere il proprio contesto aziendale è difficile esserne certi.

Dalla tua domanda sospetto che tu non ti renda conto che le pseudo-colonne di data Oracle includono un elemento temporale. Prova questo:

alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss'
/
select current_date from dual
/
select sysdate from dual
/

Non ha molto senso racchiudere una di quelle pseudo-colonne nella propria funzione definita dall'utente. L'unica volta che ho preso seriamente in considerazione è stato quello di rendere più facile iniettare i tempi in alcuni test unitari automatizzati. Ma non mi sono mai convinto che questa facilità giustificasse il mancato utilizzo dell'approccio standard.

modifica

La soluzione nella risposta accettata funziona ma ha un sacco di bagagli inutili. Tutto quel PL/SQL aggiuntivo viene eseguito 2-3 volte più lentamente di un semplice select sysdate from dual; . È vero che si tratta di differenze molto piccole in termini assoluti - millisecondi, se quello. Ma in un sistema occupato con molte chiamate a getSysdate() tutti quei millisecondi potrebbero aggiungere una grossa fetta di tempo. Una soluzione migliore sarebbe sostituire tutto quel codice con un semplice return sysdate; Questo è leggermente più lento della chiamata a sysdate direttamente ma solo di poco.

Espandendo il commento di dpbradley, ho attivato una funzione che ci consente di sostituire un tempo di clock diverso dal database, ai fini del test. Sto memorizzando il mio datetime alternativo nello spazio dei nomi CLIENT_INFO nel contesto predefinito; se lo implementassi in un sistema di produzione, costruirei un contesto definito dall'utente dedicato per esso.

Quindi ecco la mia opinione su getSysdate() funzione...

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> 

Ecco come impostiamo la data e l'ora alternativa...

SQL> exec dbms_application_info.set_client_info('01-DEC-2010 12:12:12')

PL/SQL procedure successfully completed.

Se non viene passato alcun parametro, restituisce sysdate (l'opzione predefinita e preferita).

SQL> select getsysdate from dual
  2  /

GETSYSDATE
-----------------
05-JAN-2010 16:25

SQL> 

Se passiamo uno spazio dei nomi di contesto quando chiamiamo la funzione, otteniamo il datetime alternativo....

SQL> select mygetsysdate('CLIENT_INFO') from dual
  2  /

MYGETSYSDATE('CLI
-----------------
01-DEC-2010 12:12

SQL>