Oracle SQL конвертирует формат даты из DD-Mon-YY в YYYYMM

У меня есть сравнение дат в 2 таблицах, но проблема в том, что одна таблица имеет дату в формате DD-Mon-YY, а другая - в формате YYYYMM.

Мне нужно сделать оба из них ГГГГММ для сравнения.

Мне нужно создать что-то вроде этого:

SELECT * FROM offers 
WHERE offer_date = (SELECT to_date(create_date, 'YYYYMM') FROM customers where id = '12345678') 
AND offer_rate > 0

где create_date — это что-то вроде 12 марта 2006 года, а offer_date — это что-то вроде 200605.

Любые идеи, где мне нужно адаптировать этот запрос??


person Tom    schedule 10.05.2012    source источник
comment
Почему у тебя проблемы? Является ли offer_date VARCHAR2 (строкой)?   -  person Phil    schedule 10.05.2012
comment
Даты не имеют таких форматов. Если вам нужен этот формат, вам нужна строка по определению. Итак, вы ищете строки (с этим форматом) или DATETIME (у которых нет формата). Итак, если ваши поля имеют разные форматы, каковы их фактические типы данных? DATETIME, VHARCHAR() и т. д.?   -  person MatBailie    schedule 10.05.2012
comment
@phil - offer_date – это числовое поле   -  person Tom    schedule 10.05.2012
comment
@Dems - в дополнение к приведенному выше комментарию, create_date - это поле DATE.   -  person Tom    schedule 10.05.2012
comment
@Tom: Было бы лучше, если бы вы могли преобразовать типы данных этих столбцов даты в DATE. Зачем использовать NUMBER для столбца даты?   -  person ypercubeᵀᴹ    schedule 10.05.2012
comment
@ypercude - к сожалению, я не в состоянии внести такие изменения - мне просто нужно разобраться с тем, что мне дано!   -  person Tom    schedule 10.05.2012


Ответы (2)


Поскольку offer_date является числом и имеет более низкую точность, чем ваши реальные даты, это может сработать...
- Преобразовать вашу реальную дату в строку формата YYYYMM
- Преобразовать это значение в INT
- Сравните результат с вашим offer_date

SELECT
  *
FROM
  offers
WHERE
    offer_date = (SELECT CAST(to_char(create_date, 'YYYYMM') AS INT) FROM customers where id = '12345678')
AND offer_rate > 0 

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

Кроме того, если бы вы манипулировали offer_date, вы не смогли бы использовать какой-либо индекс в этом поле и, таким образом, задействовали бы SCAN вместо SEEK.

person MatBailie    schedule 10.05.2012

Я что-то упускаю? Вы можете просто преобразовать offer_date в сравнение:

SELECT *
FROM offers
WHERE to_char(offer_date, 'YYYYMM') = (SELECT to_date(create_date, 'YYYYMM') FROM customers where id = '12345678') AND
      offer_rate > 0 
person Gordon Linoff    schedule 10.05.2012
comment
Я думаю, вы где-то рядом с решением. Не поможет ли это, если я скажу, что create_date — это формат DATE, а offer_date — это формат NUMBER (что на самом деле не так уж полезно!) - person Tom; 10.05.2012
comment
WHERE to_char(offer_date, 'YYYYMM') = (SELECT to_char(create_date, 'YYYYMM') FR... проделал трюки... спасибо, что указали мне правильное направление. - person Tom; 10.05.2012
comment
@Tom: обратите внимание; обертывание offer_date в to_char() запутает любой индекс в этом поле. Вместо этого вы можете выполнять всю обработку на create_date, так как вам нужно сделать это только один раз для этого запроса, а затем использовать индексы для поиска по индексу на offer_date. [Выполнение манипуляций со скалярными константами почти бесконечно предпочтительнее манипулирования искомыми данными.] - person MatBailie; 10.05.2012