2017-09-20 260 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 
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 
WHERE 
    date_id >= 20170920 
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,它始終是更好地保持他們的DATETIMESTAMP格式。這樣,日期操作可以很容易地執行(例如,添加日期爲5天)。通過使用'YYYYMMDD'::DATE,您仍然可以輕鬆地進行比較操作。

既然你是從一個字符串轉換,並且轉換成一時間似乎工作,和你有一些空字符串,用這個將其轉換爲一個日期:

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

這將返回如果字符串爲空,則爲NULL;如果日期包含可以轉換的日期,則爲Date。