Oracle
 sql >> Base de données >  >> RDS >> Oracle

Créer une fonction pour renvoyer la date et l'heure actuelles dans Oracle

CURRENT_DATE renvoie la date et l'heure de la session. SYSDATE renvoie la date et l'heure de la base de données. Ces valeurs peuvent être différentes car nous pouvons changer le fuseau horaire de notre session en utilisant ALTER SESSION . Vous devriez probablement utiliser SYSDATE car il renvoie une valeur cohérente, même si sans connaître le contexte de votre entreprise, il est difficile d'en être certain.

D'après votre question, je soupçonne que vous ne réalisez pas que les pseudo-colonnes de date Oracle incluent un élément de temps. Essayez ceci :

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

Il n'y a pas beaucoup d'intérêt à envelopper l'une de ces pseudo-colonnes dans votre propre fonction définie par l'utilisateur. La seule fois où j'y ai sérieusement pensé, c'était pour faciliter l'injection de temps dans certains tests unitaires automatisés. Mais je ne me suis jamais convaincu que cette facilité justifierait de ne pas utiliser l'approche standard.

modifier

La solution dans la réponse acceptée fonctionne mais contient beaucoup de bagages inutiles. Tout ce PL/SQL supplémentaire s'exécute 2 à 3 fois plus lentement qu'un simple select sysdate from dual; . Il est vrai que ce sont de très petites différences en termes absolus - millisecondes, si cela. Mais dans un système occupé avec de nombreux appels à getSysdate() toutes ces millisecondes pourraient représenter une grande partie du temps. Une meilleure solution serait de remplacer tout ce code par un simple return sysdate; C'est légèrement plus lent que d'appeler sysdate directement mais seulement de peu.

En développant le commentaire de dpbradley, j'ai créé une fonction qui nous permet de substituer une heure d'horloge différente de la base de données, à des fins de test. Je stocke mon autre datetime dans l'espace de noms CLIENT_INFO dans le contexte par défaut; si je l'implémentais dans un système de production, je créerais un contexte dédié défini par l'utilisateur.

Voici donc mon point de vue sur le getSysdate() fonction...

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> 

Voici comment définir la date et l'heure alternatives...

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

PL/SQL procedure successfully completed.

Si aucun paramètre n'est passé, il renvoie sysdate (l'option par défaut et préférée).

SQL> select getsysdate from dual
  2  /

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

SQL> 

Si nous passons un espace de noms de contexte lorsque nous appelons la fonction, nous obtenons la date/heure alternative....

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

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

SQL>