sql >> Databasteknik >  >> RDS >> Oracle

Skapa en funktion för att returnera aktuellt datum och tid i Oracle

CURRENT_DATE returnerar datum och tid för sessionen. SYSDATE returnerar datum och tid för databasen. Dessa värden kan vara olika eftersom vi kan ändra vår sessions tidszon med ALTER SESSION . Du borde förmodligen använda SYSDATE eftersom det ger ett konsekvent värde, men utan att känna till ditt affärssammanhang är det svårt att vara säker.

Från din fråga misstänker jag att du inte inser att Oracle datum pseudo-kolumner innehåller ett tidselement. Prova detta:

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

Det är inte mycket meningsfullt att slå in en av dessa pseudo-kolumner i din egen användardefinierade funktion. Den ena gången jag allvarligt övervägde det var att göra det lättare att injicera tider i några automatiserade enhetstester. Men jag övertygade aldrig mig själv om att denna möjlighet skulle motivera att inte använda standardmetoden.

redigera

Lösningen i det accepterade svaret fungerar men har mycket onödigt bagage. All den extra PL/SQL körs 2-3 gånger långsammare än en rak select sysdate from dual; . Det är sant att det är väldigt små skillnader i absoluta termer - millisekunder om så är fallet. Men i ett upptaget system med många anrop till getSysdate() alla dessa millisekunder kan summera till en stor del av tiden. En bättre lösning skulle vara att ersätta all den koden med ett vanligt return sysdate; Detta är något långsammare än att anropa sysdate direkt men bara lite.

För att expandera på dpbradleys kommentar har jag knackat upp en funktion som gör att vi kan ersätta en annan klocktid från databasen, i testsyfte. Jag lagrar min alternativa datumtid i namnområdet CLIENT_INFO i standardkontexten; om jag implementerade detta i ett produktionssystem skulle jag bygga ett dedikerat användardefinierat sammanhang för det.

Så här är min syn på 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> 

Så här ställer vi in ​​den alternativa datumtiden...

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

PL/SQL procedure successfully completed.

Om ingen parameter skickas returneras sysdate (standard och föredraget alternativ).

SQL> select getsysdate from dual
  2  /

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

SQL> 

Om vi ​​skickar ett kontextnamnutrymme när vi anropar funktionen får vi den alternativa datetime....

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

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

SQL>


  1. Lägg till en ny kolumn i en stor mysql-tabell

  2. Hur man infogar datum i en Oracle relationsdatabas med C#

  3. Hur får man det totala antalet tabeller i postgresql?

  4. Utfasad:mysql_pconnect():