2014-09-05 2 views
1

Я застрял в этом запросе. Нижняя часть «TRANSMITTED_DATE LIKE '17 -JUL-14» жестко запрограммирована. Я хочу сделать его обобщенным.Дата в формате varchar и dd-mmm-yy

Я хочу сделать что-то вроде этого

WHERE CAST(TRANSMITTED_DATE AS DATE FORMAT 'DD-MMM-YY') BETWEEN 
     CAST(CURRENT_DATE AS DATE FORMAT 'DD-MMM-YY') 
     AND CAST(CURRENT_DATE AS DATE FORMAT 'DD-MMM-YY')-7 

т.е. за последние семь дней записи с последнего времени этот запрос выполняется по таблице.

Но дата передачи - поле VARCHAR в таблице, а формат - как 31-OCT-13 i.e DD-MMM-YY.

Пожалуйста, помогите мне с запросом.

SELECT 
     MLI_MDL_NUMBER as DOCUMENTUM_MLI 
     ,TRANSMITTAL_NUMBER 
     ,PROJECT_ID 
     ,TRANSMITTED_DATE 
    FROM GEEDW_PLP_BULK_V.CDR_DOCUMENTUM_TRSMTL 
    WHERE 
    (TRANSMITTED_DATE LIKE '17-JUL-14' OR 
    TRANSMITTED_DATE LIKE '18-JUL-14' OR 
    TRANSMITTED_DATE LIKE '19-JUL-14' OR 
    TRANSMITTED_DATE LIKE '20-JUL-14' OR 
    TRANSMITTED_DATE LIKE '21-JUL-14' OR 
    TRANSMITTED_DATE LIKE '22-JUL-14' OR 
    TRANSMITTED_DATE LIKE '23-JUL-14' OR 
    TRANSMITTED_DATE LIKE '24-JUL-14' OR 
    TRANSMITTED_DATE LIKE '25-JUL-14' 
    ); 
+0

У вас теперь есть «между верхними и нижними», поможет ли это изменить эти ограничения? Кроме того, какие проблемы вы видите? (сообщения об ошибках, данные с ошибкой, ...) –

ответ

1

В зависимости от глобальной системной настройки (Century Break in dbscontrol) или выпуска Teradata это может быть легко.

Если вы на TD14 вы можете использовать TO_DATE Оракула:

WHERE TO_DATE(TRANSMITTED_DATE, 'dd-mon-yy') 
     BETWEEN CURRENT_DATE - 7 AND CURRENT_DATE 

В противном случае попробуйте выполнить запрос и проверить, что вернулся:

SELECT CAST('17-JUL-14' AS DATE FORMAT 'DD-MMM-YY') 

Если это 2014-07-17 Вы можете просто использовать

WHERE CAST(TRANSMITTED_DATE AS DATE FORMAT 'DD-MMM-YY') 
     BETWEEN CURRENT_DATE - 7 AND CURRENT_DATE 

Если это 1914-07-17

WHERE CAST(SUBSTRING(TRANSMITTED_DATE FROM 1 FOR 7) || '20' || 
      SUBSTRING(TRANSMITTED_DATE FROM 8) AS DATE FORMAT 'DD-MMM-YY') 
     BETWEEN CURRENT_DATE - 7 AND CURRENT_DATE 

Конечно, все идет плохо, потому что каждая строка должна быть преобразована из строки на сегодняшний день, что является большой накладной, и вы потеряете существующую статистику.

Если это большая таблица, и вам нужно часто выполнять этот запрос, вы должны попытаться изменить тип данных на DATE и сделать приведение типа один раз во время импорта.

И еще одна проблема: если есть какая-либо строка, представляющая недействительную дату, ваш запрос не удастся.

+0

Привет, Дноет, Спасибо за ответ. Я попытался добавить еще один интервал 100-летнего CAST (TRANSMITTED_DATE AS DATE FORMAT 'DD-MMM-YY') + INTERVAL '100' YEAR BETWEEN CAST (CURRENT_DATE AS DATE FORMAT 'DD-MMM-YY') - 7 И CAST (CURRENT_DATE AS DATE FORMAT «DD-MMM-YY») ..... Это работало .. будет ли это причиной каких-либо проблем? – user3901666

+0

Вам не нужно применять акцию к CURRENT_DATE, и этот запрос не удастся, если есть строка с 29-feb-00, потому что 1900 не был високосным годом. – dnoeth

+0

Привет, Дноет, Спасибо за ваш ответ. Я не получил, когда вы сказали: «Этот запрос не удастся, если есть какая-то строка с 29-feb-00, потому что 1900 год не был високосным». Не могли бы вы немного объяснить. – user3901666