Как найти данные за период, когда формат даты в американском стиле даты - PullRequest
0 голосов
/ 13 января 2020

ИМЯ ТАБЛИЦЫ = CONTRACT_DATA

CONTRACT    DATE
A           10/25/2019
B           06/20/2019
C           10/01/2019
D           10/05/2019

Запрос:

select * 
from CONTRACT_DATA
WHERE DATE(VALUE_DATE,'MM/DD/YYYY') > '10/01/2019' AND 
      DATE(VALUE_DATE,'MM/DD/YYYY') < '10/31/2019'

Пытался получить данные в октябре месяце, но не смог

Требуемый вывод A, C , D

Ответы [ 3 ]

2 голосов
/ 13 января 2020

В 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 здесь

2 голосов
/ 13 января 2020

Для сравнения вам потребуется преобразовать строку в дату, используя TO_DATE(); на другой стороне оператора для фиксированных значений вы можете использовать DATE litteral:

SELECT *
FROM contract_data
WHERE 
    TO_DATE(value_date, 'MM/DD/YYY') > DATE'2019-10-01'
    AND TO_DATE(value_date, 'MM/DD/YYY') < DATE'2019-10-31'

Примечание: если вы хотите весь месяц, то вам нужно отрегулировать границы

SELECT *
FROM contract_data
WHERE 
    TO_DATE(value_date, 'MM/DD/YYY') >= DATE'2019-10-01'
    AND TO_DATE(value_date, 'MM/DD/YYY') < DATE'2019-11-01'
0 голосов
/ 13 января 2020

Если ваша дата хранится в виде строки в таблице, вы можете просто использовать функцию to_date и литерал DATE следующим образом:

select * 
  from CONTRACT_DATA
 WHERE TO_DATE(VALUE_DATE,'MM/DD/YYYY') 
       BETWEEN DATE '2019-10-01' AND DATE '2019-10-31'

Cheers !!

...