Заставить sysdate Oracle возвращать различное значение для нескольких операторов - PullRequest
0 голосов
/ 25 декабря 2018

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

Документация кажется довольно плохой для этого: убедитесь сами

Я использую Oracle 11g с SQL Developer 18.3

Пожалуйста, читайте дальшеMVCE ниже.

После выполнения этого:

create table t(a timestamp);
insert into t values (sysdate);
insert into t values (sysdate);
insert into t values (sysdate);
select * from t;

Я получаю:

A                          
---------------------------
18/12/25 04:25:59,000000000
18/12/25 04:25:59,000000000
18/12/25 04:25:59,000000000

Я хотел бы получить (изменено вручную):

A                          
---------------------------
18/12/25 04:25:59,1234
18/12/25 04:25:59,7281
18/12/25 04:26:00,1928

Реальная проблема представлена ​​в различных CALL инструкциях для процедур, но приведенный выше пример, кажется, повторяет проблему для меня.


ОБНОВЛЕНИЕ

Одна вещь, которая мне показалась полезной, это поставить паузы между утверждениями, но это действительно не то, что я ищу:

set pause on;
create table t(a timestamp);
insert into t values (sysdate);
pause
insert into t values (sysdate);
pause
insert into t values (sysdate);

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Как отмечено в документации, функция sysdate возвращает дату , которая имеет точность только до секунд - она ​​не поддерживает доли секунды.Таким образом, несколько вызовов в течение одной секунды всегда получат одно и то же значение, и вы не можете заставить его делать что-либо еще.

Вы помещаете это значение даты в столбец timestamp , что вызывает неявное преобразование из одного типа данных в другой, но это преобразование не может установить / создать новое значение долей секунд - оно сохраняет неявные дробные секунды от даты, которая, конечно, всегда равна нулю.

Как и sysdate, Oracle имеет функцию a systimestamp , которая возвращает отметку времени со значением часового пояса - и которая имеет доли секунды.Точность ограничена платформой, на которой вы работаете.Если вы используете это для заполнения столбца с простой отметкой времени, тогда неявное преобразование все еще происходит, но вы просто выбрасываете информацию о часовом поясе.

Oracle также поддерживает current_date и current_timestamp, которые очень похожи - за исключением того, что они возвращают дату / время в часовом поясе текущего сеанса, а не в часовом поясе сервера, как это делают версии sys*.

0 голосов
/ 25 декабря 2018

Я обнаружил, что current_timestamp выполняет работу:

drop table t;
create table t(a timestamp);
insert into t values (current_timestamp);
insert into t values (current_timestamp);
insert into t values (current_timestamp);
select * from t;

Выходы:

A                          
---------------------------
18/12/25 04:48:54,134000000
18/12/25 04:48:54,142000000
18/12/25 04:48:54,149000000
...