Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erstellen Sie eine Funktion, um das aktuelle Datum und die Uhrzeit in Oracle zurückzugeben

CURRENT_DATE gibt das Datum und die Uhrzeit der Sitzung zurück. SYSDATE gibt das Datum und die Uhrzeit der Datenbank zurück. Diese Werte können unterschiedlich sein, da wir die Zeitzone unserer Sitzung mit ALTER SESSION ändern können . Sie sollten wahrscheinlich SYSDATE verwenden weil es einen konsistenten Wert zurückgibt, obwohl es schwierig ist, sich sicher zu sein, ohne Ihren Geschäftskontext zu kennen.

Aufgrund Ihrer Frage vermute ich, dass Sie nicht erkennen, dass Oracle-Datums-Pseudospalten ein Zeitelement enthalten. Versuchen Sie Folgendes:

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

Es macht nicht viel Sinn, eine dieser Pseudo-Spalten in Ihre eigene benutzerdefinierte Funktion einzubinden. Das eine Mal, als ich ernsthaft darüber nachdachte, war, es einfacher zu machen, Zeiten in einige automatisierte Unit-Tests einzufügen. Aber ich habe mich nie davon überzeugt, dass diese Einrichtung es rechtfertigen würde, den Standardansatz nicht zu verwenden.

bearbeiten

Die Lösung in der akzeptierten Antwort funktioniert, hat aber viel unnötiges Gepäck. All dieses zusätzliche PL/SQL läuft 2-3 Mal langsamer als ein einfaches select sysdate from dual; . Es stimmt, dass dies in absoluten Zahlen sehr kleine Unterschiede sind – Millisekunden, wenn überhaupt. Aber in einem ausgelasteten System mit vielen Aufrufen von getSysdate() All diese Millisekunden könnten sich zu einem großen Zeitabschnitt summieren. Eine bessere Lösung wäre, diesen ganzen Code durch ein einfaches return sysdate zu ersetzen; Dies ist etwas langsamer als das Aufrufen von sysdate direkt, aber nur ein wenig.

Ausgehend von dpbradleys Kommentar habe ich eine Funktion entwickelt, die es uns ermöglicht, zu Testzwecken eine andere Uhrzeit aus der Datenbank zu ersetzen. Ich speichere meine alternative Datetime im CLIENT_INFO-Namespace im Standardkontext; Wenn ich dies in einem Produktionssystem implementieren würde, würde ich einen dedizierten benutzerdefinierten Kontext dafür erstellen.

Hier ist also meine Interpretation von getSysdate() Funktion...

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> 

So legen wir die alternative Datumszeit fest...

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

PL/SQL procedure successfully completed.

Wenn kein Parameter übergeben wird, wird sysdate zurückgegeben (die standardmäßige und bevorzugte Option).

SQL> select getsysdate from dual
  2  /

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

SQL> 

Wenn wir beim Aufruf der Funktion einen Kontext-Namensraum übergeben, erhalten wir die alternative Datumszeit....

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

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

SQL>