Кажется, вы не понимаете, что хранят значения. Тип данных 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 здесь