Как мне конвертировать между org.hibernate.type.TimestampType и Oracle SYSDATE? - PullRequest
0 голосов
/ 29 января 2020

У меня есть столбец, который отображается в спящем режиме с помощью org.hibernate.type.TimestampType. Как я могу использовать собственный Oracle SQL для хранения и извлечения этих значений на основе Oracle TIMESTAMP?

Столбец отображается как NUMBER(10). Я попытался использовать некоторые формулы, которые я нашел для Unix отметок времени, но, похоже, они не дали правильных результатов.

Вот недавняя отметка времени: 1579730473525 Это была бы некоторая дата в течение последних 2- 3 недели (январь 2020 г.).

Подробности

Я хочу использовать Hibernate Envers с ValidityAuditStrategy. У меня проблемы, потому что я применяю Envers к базе данных существующих записей, у которых нет истории аудита. Я пытаюсь сделать одноразовую вставку данных аудита, используя Oracle SYSDATE в качестве метки времени.

1 Ответ

2 голосов
/ 07 февраля 2020

Я не был уверен, в каком формате был ваш номер 1579730473525, поэтому я сделал предположение и взял первые 10 цифр, используя SUBSTR, и в результате была получена приемлемая дата 2020 года:

SELECT TO_DATE('1970-01-01','YYYY-MM-DD') +
NUMTODSINTERVAL(TO_NUMBER(SUBSTR('1579730473525',1,10)), 'SECOND') FROM dual;

возвращает

22/01/2020 22:01:13              

Затем, чтобы получить TIMESTAMP, я добавил последние 4 цифры.

SELECT to_char(TO_DATE('1970-01-01','YYYY-MM-DD') +
NUMTODSINTERVAL(TO_NUMBER(SUBSTR('1579730473525',1,10)), 'SECOND') ,'YYYY-MM-DD hh:mm:ss') ||'.'||SUBSTR('1579730473525',10,4)
FROM dual;

, и это возвращает:

2020-01-22 10:01:13.3525         

(Я не смог найти способ прямого преобразования числа 14 di git обратно в формат ГГГГ-ММ-ДД чч: мм: сс: ff; он жаловался на точность)

Затем, чтобы получить число в формате TIMESTAMP:

SELECT TO_TIMESTAMP(TO_CHAR(TO_DATE('1970-01-01','YYYY-MM-DD') +
NUMTODSINTERVAL(TO_NUMBER(SUBSTR('1579730473525',1,10)), 'SECOND') ,'YYYY-MM-DD hh:mi:ss') ||'.'||SUBSTR('1579730473525',10,4),'YYYY-MM-DD hh:mi:ss:ff')
FROM dual;

, и это возвращает его в Oracle TIMESTAMP в соответствии с запросом, используя Oracle SQL.

Просто подсказка: если если вы откажетесь от форматирования, запишите параметр NLS NLS_TIMESTAMP_FORMAT на случай, если возникнут проблемы с форматированием.

...