2015-04-10 8 views
0

Мне нужно получить строки, для которых service_date больше prod_date. Тип данных для prod_date - VARCHAR (10) (например, 2/20/2014), а тип данных для service_date - DATE (YYYYMMDD). Если я запрошу service_date, используя «select service_date from service where service_date = '20140201», результат отображает «2/1/2014» в сетке результатов. Тем не менее, это не работает в запросе ниже, когда я конвертирую service_date в varchar для сравнения с prod_date. Он вытаскивает все строки вместо тех, у которых больше service_date.Сравнение столбцов даты

SELECT P.PROD_ID, P.PROD_DESC, S.PROD_ID, S.SERVICE_LOC 
FROM PRODUCT P 
INNER JOIN SERVICE S 
WHERE P.PROD_ID = S.PROD_ID 
AND CAST(S.SERVICE_DATE AS VARCHAR(10)) >= P.PROD_DATE 
+0

Разве все месяцы между январем и сентябрем для цифр «PROD_DATE»? –

+0

Да, одна цифра. – angelcake

ответ

1

Я предлагаю вам использовать дату упорядочивание вместо строки/VARCHAR заказа, если это возможно, для простоты и поскольку его [вероятно] ближе к тому, что ваш интерес в и менее вероятно, чтобы запутать

Например

'01/02/2014' >= '04/01/2013' -- if these are dates or cast to dates 

но

'01/02/2014' < '04/01/2013' -- if these are strings 

Так держать вещи простыми, это имеет смысл отливать PROD_DATE к дате, когда сравнивая эти два поля как:

SELECT P.PROD_ID, P.PROD_DESC, S.PROD_ID, S.SERVICE_LOC 
FROM PRODUCT P 
INNER JOIN SERVICE S 
WHERE P.PROD_ID = S.PROD_ID 
AND S.SERVICE_DATE >= cast(P.PROD_DATE as date format 'DD/MM/YYYY') 
; 

если Theres любые сомнения относительно качества prod_dates, как действительные даты можно проверить преобразование на все даты первого (перед запуском/регулировка выше)

+0

Это дает мне ошибку «неправильной даты» при передаче PROD_DATE в формат даты. – angelcake

+0

Формат недействителен, поскольку Teradata ожидает двухзначный месяц. Я не вижу способа заставить предложение FORMAT принять один разрядный месяц. –

+0

Исправить. Я просто сделал тест, и терадата принимает только двухзначный формат. – angelcake

0

Это ISN '100% -ное подтверждение ошибки, учитывая, что ваша дата является символом и может иметь неожиданные значения. Он показывает, как вы можете добавить ведущее значение 0 к значению месяца и отнести его к дате, когда месяц определяется как одна цифра в зависимости от местоположения / во второй позиции значения PROD_DATE для данной строки.

SELECT CASE WHEN POSITION('/' IN TRIM(P.PROD_DATE)) = 2 
      THEN CAST('0'|| TRIM(P.PROD_DATE) AS CHAR(10)) AS DATE FORMAT 'MM/DD/YYYY') 
      ELSE CAST(P.PROD_DATE AS DATE FORMAT 'MM/DD/YYYY') 
     END AS PROD_DATE_ 
    FROM PRODUCT P; 
Смежные вопросы