Это распространенное заблуждение - тип данных DATE
всегда хранится в таблицах Oracle как 7 байтов , содержащих год (2 байта), месяц, день, часы, минуты и секунды (по 1 байту каждый)).Он никогда не будет хранить только компонент год / месяц / день.
Однако, если вы не предоставите Oracle какую-либо информацию о том, что поместить в компонент времени, Oracle установит для этих компонентов значения по умолчанию, равные нулю.
Итак, если вы сделаете:
CREATE TABLE table_name ( value DATE );
INSERT INTO table_name
SELECT DATE '2018-01-01' FROM DUAL UNION ALL
SELECT CAST( TIMESTAMP '2018-10-04 08:20:14' AS DATE ) FROM DUAL;
Затем:
SELECT TO_CHAR( value, 'YYYY-MM-DD"T"HH24:MI:SS' ) AS formatted,
DUMP( value ) AS dmp,
EXTRACT( HOUR FROM CAST( value AS TIMESTAMP ) ) As hr
FROM table_name;
Выходы:
FORMATTED DMP HR
------------------- ---------------------------------- --
2018-01-01T00:00:00 Typ=12 Len=7: 120,118,1,1,1,1,1 0
2018-10-04T08:20:14 Typ=12 Len=7: 120,118,10,4,9,21,15 8
Показывает, что компоненты времени присутствуют;Вы можете извлечь их, используя функции TO_CHAR
или EXTRACT
;и если вы не укажете значения, они по умолчанию будут равны нулю.
я сохраняю только дату, а не время.Можно извлечь время
Нет, если вы не указали время, Oracle по умолчанию установит для часов, минут и секунд значение даты 00:00:00
.
Если вы использовали SYSDATE
(или что-то подобное) для вставки дат, тогда у него будет ненулевой компонент времени, и компонент времени просто не отображается вашим пользовательским интерфейсом, вы можете использовать TO_CHAR
и т. Д. Для переопределенияФормат даты вашего пользовательского интерфейса по умолчанию и получить информацию.