Я новичок в oracle, мне нужно создать функцию, которая возвращает текущую дату и время.Создайте функцию для возврата текущей даты и времени в oracle
Я использую это, чтобы вернуть дату;
SELECT CURRENT_DATE FROM dual;
Thanx
Я новичок в oracle, мне нужно создать функцию, которая возвращает текущую дату и время.Создайте функцию для возврата текущей даты и времени в oracle
Я использую это, чтобы вернуть дату;
SELECT CURRENT_DATE FROM dual;
Thanx
В качестве реальной функции вы можете сделать:
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 включает временную часть.
Eek. Как насчет «возврата sysdate»? –
Правда. Я пытался сохранить тему того, что он делал. Я бы просто использовал sysdate вместо любой функции. –
попробовать:
SELECT TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY HH:MI:SS') FROM dual;
, если вам это нужно в определенном формате. Другие варианты здесь:
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>
Если вы считаете, что ваше приложение db/application будет когда-либо задействовано в воспроизведении Real Application Testing, тогда разработка с помощью обертки вокруг SYSDATE поможет в тех средах, где по какой-либо причине вы не можете изменить хост-часы. – dpbradley
Самый простой, я полагаю:
SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;
То, что кажется быть проблемой? –