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>