Как передать значение временной метки в Oracle хранимой процедуре? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть столбец таблицы с типом данных timestamp. Как передать значение метки времени в столбец таблицы? Я передаю to_timestamp ('1240', 'HH: MI: SS') в процедуре oracle. В таблице БД у меня есть значение типа 01-AUG-20 12.40.00.000000000 PM. Я хочу сохранить только временную метку в таблице БД. Есть способ? Пожалуйста, помогите мне в этом. Спасибо

1 Ответ

3 голосов
/ 05 августа 2020

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

Если вы хотите сохранить время, то либо:

  • Используйте тип данных INTERVAL DAY TO SECOND (с нулевыми днями);
  • Используйте тип данных DATE (или, если вам нужны дробные секунды, TIMESTAMP) и установите для компонентов год-день фиксированное значение ( или игнорировать их);
  • Использовать строку в фиксированном формате; или
  • Сохраните количество секунд после полуночи и используйте TO_DATE( value, 'SSSSS' ) для преобразования в дату, а затем TO_CHAR, чтобы отформатировать его по мере необходимости.

Я бы сказал, что если вы хотите добавить время, а затем используйте тип данных INTERVAL, так как он будет изначально поддерживать это.

Например:

CREATE TABLE times1 ( value INTERVAL DAY TO SECOND );

INSERT INTO times1 ( value ) VALUES ( INTERVAL '12:40' HOUR TO MINUTE );

SELECT * FROM times1;

Какие результаты:

| VALUE               |
| :------------------ |
| +00 12:40:00.000000 |

Если вы хотите отображать время, используйте DATE и игнорируйте компоненты от года к дню, так как вы можете легко отформатировать время, используя TO_CHAR.

Например:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

CREATE TABLE times2 ( value DATE );

INSERT INTO times2 ( value )
-- Fixed date
SELECT DATE '1970-01-01' + INTERVAL '12:40' HOUR TO MINUTE FROM DUAL UNION ALL
-- Today's date
SELECT TRUNC( SYSDATE ) + INTERVAL '12:40' HOUR TO MINUTE FROM DUAL UNION ALL
-- First of current month
SELECT TO_DATE( '12:40', 'HH24:MI' ) FROM DUAL;

SELECT value, TO_CHAR( value, 'HH24:MI' ) FROM times2;

Какие выходы:

VALUE               | TO_CHAR(VALUE,'HH24:MI')
:------------------ | :-----------------------
1970-01-01 12:40:00 | 12:40                   
2020-08-05 12:40:00 | 12:40                   
2020-08-01 12:40:00 | 12:40                   

db <> fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...