Создать функцию для возврата текущей даты и времени в Oracle - PullRequest
2 голосов
/ 04 января 2010

Я новичок в Oracle, мне нужно создать функцию, которая возвращает текущую дату и время.

Я использую это, чтобы вернуть дату;

SELECT CURRENT_DATE FROM dual;

Thanx

Ответы [ 4 ]

12 голосов
/ 05 января 2010

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>
2 голосов
/ 05 января 2010

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

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 голос
/ 04 января 2010

попробовать:

SELECT TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY HH:MI:SS') FROM dual;

если вам это нужно в определенном формате. Больше вариантов здесь:

http://www.psoug.org/reference/date_func.html

0 голосов
/ 12 декабря 2015

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

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;
...