2017-09-20 1 views
0

두 날짜를 비교하려고 할 때 오류가 발생하는 redshift에서 실행중인 쿼리가 있습니다. 날짜가 VARCHAR이고 일부가 빈 문자열 인 데이터 문제로 인한 것입니다. 가장 좋은 해결책은이 문제를 근원지에서 해결하는 것이 분명하지만, 해결 방법을 시도하는 중에 아주 이상한 행동을 발견하게됩니다.Redshift에서 잘못된 데이터 오류가 발생했습니다

주위를 돌아 다니려면 빈 문자열이 아닌 날짜를 사전 선택하고 날짜로 형변환 한 다음 정수 날짜 형식 (YYYYMMDD)으로 변환하고 INT로 변환하십시오. 이것은 잘 실행됩니다. 그러나 WHERE 절의 정수와이 값을 비교하려고하면 쿼리가 데이터 형식 오류와 충돌합니다. 여기

SELECT 
    date_id, 
    COUNT(*) 
FROM 
    (
    SELECT 
     CONVERT(int, date_id) AS date_id 
    FROM 
     (
     SELECT 
      DATE_PART('year', start_dttm)*10000+DATE_PART('month', start_dttm)*10+DATE_PART('day', start_dttm) AS date_id 
     FROM   
      (
      SELECT 
       CAST(start_dttm AS DATETIME) AS start_dttm 
      FROM 
       sfe.calendar_detail 
      WHERE 
       start_dttm <> '' 
      ) cda 
     ) cdb 
    ) cd 
WHERE 
    date_id >= 20170920 
GROUP BY 
    date_id 
; 

내가 위에서 언급 한 바와 같이 실패한 쿼리 작업 쿼리 여기

SELECT 
    date_id, 
    COUNT(*) 
FROM 
    (
    SELECT 
     CONVERT(int, date_id) AS date_id 
    FROM 
     (
     SELECT 
      DATE_PART('year', start_dttm)*10000+DATE_PART('month', start_dttm)*10+DATE_PART('day', start_dttm) AS date_id 
     FROM   
      (
      SELECT 
       CAST(start_dttm AS DATETIME) AS start_dttm 
      FROM 
       sfe.calendar_detail 
      WHERE 
       start_dttm <> '' 
      ) cda 
     ) cdb 
    ) cd 
GROUP BY 
    date_id 
; 

과의 장난감 버전입니다, 올바른 솔루션은 데이터 형식을 수정하고 빈 계산하는 것입니다 날짜는 Nulls가 아닌 빈 문자열이지만, 두 번째 쿼리가 잘못된 데이터 형식 오류로 인해 충돌하는 이유에 대해 매우 궁금합니다.

많은 감사!

편집 : 다음은 오류

ERROR: Invalid digit, Value '1', Pos 0, Type: Integer 
DETAIL: 
    ----------------------------------------------- 
    error: Invalid digit, Value '1', Pos 0, Type: Integer 
    code:  1207 
    context: 
    query:  2006739 
    location: :0 
    process: query0_39 [pid=0] 
    ----------------------------------------------- 
+0

@ 500-InternalServerError 가장 큰 값은 99991231이며 redshift doc 사이트의 최대 값보다 적습니다. 2147483647 – lucas

답변

0

보다는 사람이 읽을 수있는 YYYYMMDD 형식으로 날짜를 변환, DATE 또는 TIMESTAMP 형식으로 그들을 유지하는 것이 더 나은 경우도 있습니다. 이렇게하면 날짜 작업을 쉽게 수행 할 수 있습니다 (예 : 날짜에 5 일 추가). 'YYYYMMDD'::DATE을 사용하여 쉽게 비교 연산자를 수행 할 수 있습니다.

당신이 문자열로 변환하고, 날짜가 작동하는 것 같다에 캐스팅, 그리고 일부 빈 문자열을 가지고, 날짜로 변환이 사용되는 것을 감안할 때 :

SELECT 
    NULLIF(start_dttm, '')::DATE AS dt 
FROM sfe.calendar_detail 
WHERE dt > '20170920'::DATE 

이것은을 반환합니다 문자열이 비어 있으면 NULL이고, 변환 될 수있는 날짜가 있으면 Date입니다.

관련 문제