Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Utwórz funkcję, aby zwrócić bieżącą datę i godzinę w Oracle

CURRENT_DATE zwraca datę i godzinę sesji. SYSDATE zwraca datę i godzinę bazy danych. Te wartości mogą się różnić, ponieważ możemy zmienić strefę czasową naszej sesji za pomocą ALTER SESSION . Prawdopodobnie powinieneś używać SYSDATE ponieważ zwraca stałą wartość, chociaż bez znajomości kontekstu biznesowego trudno mieć pewność.

Z twojego pytania podejrzewam, że nie zdajesz sobie sprawy, że pseudokolumny z datą Oracle zawierają element czasu. Spróbuj tego:

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

Zawijanie jednej z tych pseudokolumn we własnej funkcji zdefiniowanej przez użytkownika nie ma większego sensu. Kiedyś poważnie zastanawiałem się nad tym, aby ułatwić wstrzykiwanie czasów do niektórych zautomatyzowanych testów jednostkowych. Ale nigdy nie przekonałem się, że to ułatwienie usprawiedliwia niestosowanie standardowego podejścia.

edytuj

Rozwiązanie w zaakceptowanej odpowiedzi działa, ale ma dużo niepotrzebnego bagażu. Cały ten dodatkowy PL/SQL działa 2-3 razy wolniej niż prosty select sysdate from dual; . To prawda, że ​​są to bardzo małe różnice w wartościach bezwzględnych - milisekundy, jeśli tak. Ale w zajętym systemie z dużą ilością wywołań getSysdate() wszystkie te milisekundy mogą w sumie dać spory kawałek czasu. Lepszym rozwiązaniem byłoby zastąpienie całego tego kodu zwykłym return sysdate; Jest to nieco wolniejsze niż wywołanie sysdate bezpośrednio, ale tylko trochę.

Rozwijając komentarz dpbradleya, podniosłem funkcję, która pozwala nam podstawić inny zegar z bazy danych, na potrzeby testów. Przechowuję moją alternatywną datę i godzinę w przestrzeni nazw CLIENT_INFO w kontekście domyślnym; gdybym implementował to w systemie produkcyjnym, zbudowałbym dla niego dedykowany kontekst zdefiniowany przez użytkownika.

Oto moje podejście do getSysdate() funkcja...

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> 

Oto jak ustawiamy alternatywną datę i godzinę...

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

PL/SQL procedure successfully completed.

Jeśli nie zostanie przekazany żaden parametr, zwraca sysdate (opcja domyślna i preferowana).

SQL> select getsysdate from dual
  2  /

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

SQL> 

Jeśli przekażemy kontekstową przestrzeń nazw, gdy wywołujemy funkcję, otrzymujemy alternatywną datę i godzinę....

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

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

SQL>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Select Max Date dla wielu rekordów

  2. Jak uciec przed słowem zastrzeżonym w Oracle?

  3. jak przenieść dane CLOB z jednej bazy danych do innej zdalnej bazy danych ORACLE posiadającej DBLinks

  4. Korzystanie z oci_parse i oci_execute

  5. Program PL/SQL do usuwania rekordów z tabeli