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>