В Oracle a DATE
тип данных всегда имеет год, месяц, день, час, минуты и секунды. Ваш пользовательский интерфейс может не отображать компонент времени, но он всегда там. Если он не указан, то по умолчанию он будет 00:00:00
(полночь), но вы не должны полагаться на это.
Кроме того, даты не имеют формата. Они хранятся внутри как 7 байтов (2 для года и 1 для каждого компонента месяц-секунда). Именно пользовательский интерфейс, который вы используете, неявно применяет формат к вашим данным, когда вы хотите отобразить их так, чтобы они имели смысл для пользователя.
Вы можете указать даты, используя:
- Литералы даты ANSI:
DATE '2019-10-01'
- Литералы метки времени ANSI:
TIMESTAMP '2019-10-01 12:34:56'
(и Oracle приведёт его к нужной дате) - Функция
TO_DATE
: TO_DATE( '10/01/2019', 'MM/DD/YYYY' )
Если у вас есть столбец DATE
, не используйте на нем TO_DATE
, поскольку он уже является DATE
; вместо этого просто сравните его с другим DATE
.
Если вы хотите, чтобы даты были октябрьскими 2019, вам нужно найти значения между 2019-10-01 00:00:00
и 2019-10-31 23:59:59
, и самый простой способ сделать это - найти значения которые больше или равны полуночи первого дня месяца и меньше полуночи первого дня следующего месяца:
Тестовые данные :
CREATE TABLE contract_data (
CONTRACT CHAR(1),
VALUE_DATE DATE
);
INSERT INTO contract_data
SELECT 'A', DATE '2019-10-25' FROM DUAL UNION ALL
SELECT 'B', DATE '2019-06-20' FROM DUAL UNION ALL
SELECT 'C', DATE '2019-10-01' FROM DUAL UNION ALL
SELECT 'D', DATE '2019-10-05' FROM DUAL UNION ALL
SELECT 'E', TIMESTAMP '2019-10-31 23:59:59' FROM DUAL;
Запрос :
SELECT *
FROM contract_data
WHERE VALUE_DATE >= DATE '2019-10-01'
AND VALUE_DATE < DATE '2019-11-01'
Выход :
CONTRACT | VALUE_DATE
:------- | :---------
A | 10/25/2019
C | 10/01/2019
D | 10/05/2019
E | 10/31/2019
дБ <> Fiddle здесь