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

Opret en funktion til at returnere nuværende dato og klokkeslæt i oracle

CURRENT_DATE returnerer dato og klokkeslæt for sessionen. SYSDATE returnerer dato og klokkeslæt for databasen. Disse værdier kan være forskellige, fordi vi kan ændre vores sessions tidszone ved hjælp af ALTER SESSION . Du burde sandsynligvis bruge SYSDATE fordi det giver en ensartet værdi, selvom det er svært at være sikker uden at kende din forretningskontekst.

Ud fra dit spørgsmål formoder jeg, at du ikke er klar over, at Oracle-dato-pseudokolonner indeholder et tidselement. Prøv dette:

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

Der er ikke så meget mening i at pakke en af ​​disse pseudo-kolonner ind i din egen brugerdefinerede funktion. Den ene gang, jeg seriøst overvejede det, var at gøre det nemmere at injicere tider i nogle automatiserede enhedstests. Men jeg har aldrig overbevist mig selv om, at denne facilitet ville retfærdiggøre ikke at bruge standardmetoden.

rediger

Løsningen i det accepterede svar virker, men har en masse unødvendig bagage. Al den ekstra PL/SQL kører 2-3 gange langsommere end en lige select sysdate from dual; . Det er rigtigt, at det er meget små forskelle i absolutte tal - millisekunder, hvis det. Men i et travlt system med mange opkald til getSysdate() alle disse millisekunder kunne summere op til en stor del af tiden. En bedre løsning ville være at erstatte al den kode med en almindelig return sysdate; Dette er lidt langsommere end at kalde sysdate direkte, men kun lidt.

I forlængelse af dpbradleys kommentar har jeg slået en funktion op, som giver os mulighed for at erstatte et andet klokkeslæt fra databasen med henblik på test. Jeg gemmer mit alternative datetime i CLIENT_INFO-navnerummet i standardkonteksten; hvis jeg implementerede dette i et produktionssystem, ville jeg bygge en dedikeret brugerdefineret kontekst til det.

Så her er mit bud 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> 

Her er, hvordan vi indstiller den alternative datotid...

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

PL/SQL procedure successfully completed.

Hvis ingen parameter sendes, returnerer den sysdate (standard og foretrukne valgmulighed).

SQL> select getsysdate from dual
  2  /

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

SQL> 

Hvis vi sender et kontekstnavneområde, når vi kalder funktionen, får vi det alternative datetime....

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

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

SQL>


  1. Betinget aggregeringsforespørgsel med en gruppe efter

  2. Installation af Rails, MySQL osv. går alt galt

  3. Hvordan kan jeg ændre root brugernavn i MySQL

  4. Spring Boot REST · @Constraint for sletning?