Oracle
 sql >> база данни >  >> RDS >> Oracle

Създайте функция за връщане на текущата дата и час в Oracle

CURRENT_DATE връща датата и часа на сесията. SYSDATE връща датата и часа на базата данни. Тези стойности може да са различни, защото можем да променим часовата зона на нашата сесия с помощта на ALTER SESSION . Вероятно трябва да използвате SYSDATE защото връща последователна стойност, въпреки че без да познавате бизнес контекста е трудно да сте сигурни.

От въпроса ви подозирам, че не осъзнавате, че псевдо-колоните с дата на Oracle включват времеви елемент. Опитайте това:

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

Няма много смисъл да опаковате една от тези псевдо-колони във вашата собствена дефинирана от потребителя функция. Единственият път, когато сериозно го обмислях, беше да улесня инжектирането на времена в някои автоматизирани тестове на единици. Но никога не съм се убеждавал, че това съоръжение би оправдало неизползването на стандартния подход.

редактиране

Решението в приетия отговор работи, но има много ненужен багаж. Целият този допълнителен PL/SQL работи 2-3 пъти по-бавно от обикновен select sysdate from dual; . Вярно е, че това са много малки разлики в абсолютно изражение - милисекунди, ако е така. Но в натоварена система с много извиквания към getSysdate() всички тези милисекунди могат да се добавят към голяма част от времето. По-добро решение би било да замените целия този код с обикновен return sysdate; Това е малко по-бавно от извикването на sysdate директно, но само с малко.

Разширявайки коментара на dpbradley, създадох функция, която ни позволява да заменим различен часовник от базата данни за целите на тестването. Съхранявам моята алтернативна дата и час в пространството от имена CLIENT_INFO в контекста по подразбиране; ако внедрявах това в производствена система, щях да изградя специален потребителски контекст за него.

И така, ето моето мнение за getSysdate() функция...

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> 

Ето как задаваме алтернативната дата и час...

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

PL/SQL procedure successfully completed.

Ако не бъде подаден параметър, той връща sysdate (опция по подразбиране и предпочитана).

SQL> select getsysdate from dual
  2  /

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

SQL> 

Ако подадем контекстно пространство от имена, когато извикаме функцията, получаваме алтернативната дата и час....

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. как да получа PL/SQL в SQLFiddle?

  2. ORACLE 10g :To_date() Невалиден месец

  3. как да изпратите параметри за задействане в Oracle

  4. SQL грешка ORA 01427

  5. Разделяне на Oracle по ключова дума