2010-01-04 2 views

ответ

2

В качестве реальной функции вы можете сделать:

create or replace function getSysdate 
return date is 

    l_sysdate date; 

begin 

    select sysdate 
    into l_sysdate 
    from dual; 

    return l_sysdate; 

end; 
/

Что вы могли бы проверить в SQLPlus как:

TEST>select getSysdate() from dual; 

GETSYSDATE 
---------- 
2010-01-04 

Не уверен, почему вы хотели бы это против только наличия sysdate в вашем коде. Тип данных даты Oracle включает временную часть.

+1

Eek. Как насчет «возврата sysdate»? –

+0

Правда. Я пытался сохранить тему того, что он делал. Я бы просто использовал sysdate вместо любой функции. –

12

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

С вашего вопроса я подозреваю, что вы не понимаете, что псевдо-столбцы Oracle date включают элемент времени. Попробуйте это:

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> 

Вот как мы установили альтернативный DateTime ...

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> 

Если мы передаем контекст имен при вызове функции мы получаем версии альтернативного DATETIME ....

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

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

SQL> 
+0

Если вы считаете, что ваше приложение db/application будет когда-либо задействовано в воспроизведении Real Application Testing, тогда разработка с помощью обертки вокруг SYSDATE поможет в тех средах, где по какой-либо причине вы не можете изменить хост-часы. – dpbradley

0

Самый простой, я полагаю:

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL; 
Смежные вопросы