2011-09-22 74 views
1

我有一個表格,其中包含字符格式的日期。我想檢查日期的格式。請讓我知道我在DB2中如何做到這一點。我知道有一個函數ISDATE,但它在DB2中不起作用。我對AS400使用DB2作爲日期基地。請幫我ISDATE相當於DB2

+0

既然則IsDate()是不是一個SQL函數,應該預期非DB2也沒有任何SQL數據庫管理系統的一部分。這是MS SQL Server的T-SQL函數。 _(Oracle還擁有OLAP的ISDATE程序。有可能是類似的功能在一些其他DBMS如Sybase)_給出很好的答案,就要看你想如何使用它,尤其是什麼通緝無效的日期值。 – user2338816

回答

3

事實上,它看起來像DB2的AS/400可能ISDATE()功能(我無法找到在V6R1參考什麼 - 或者,有趣的是,LUW參考)。所以你的問題似乎是該函數不存在。

問題的根源當然是試圖翻譯無效日期導致語句停止。鑑於此,如果格式可能,該聲明應該給你一個日期,如果不是,則爲空。請注意,如果你已經混美國和歐元格式/排序,你可能能夠正確地恢復數據(如果你的分隔符是不同的,我認爲他們是在默認情況下,你可能會好起來的)。

WITH date_format(strDate, format) as (
    SELECT strDate, 
     CASE 
      WHEN strDate LIKE('____-__-__') THEN 'ISO' 
      WHEN strDate LIKE('__.__.____') THEN 'EUR' 
      WHEN strDate LIKE('__/__/____') THEN 'USA' 
      ELSE NULL END 
    FROM dataTable 
) 
SELECT 
    strDate, 
    format, 
    CASE 
     WHEN format IS NOT NULL THEN DATE(strDate) 
     ELSE NULL 
    END AS realDate 
FROM date_format 

這將打開一個DataTable看起來像這樣:

String Dates 
============= 
2011-09-22 
22.09.2011 
09/22/2011 
a111x90x00 -- And who knows what this is... 

進入這個:

Results: 
strDate  format realDate 
============================ 
2011-09-22 ISO  2011-09-22 
22.09.2011 EUR  2011-09-22 
09/22/2011 USA  2011-09-22 
a111x90x00 -  -    

本例使用默認的格式,這些格式自動轉換當然是。如果你還有其他的東西,你必須手動翻譯它(而不是返回格式,你可以將它轉換爲ISO然後將其轉換爲ISO)。

+0

使其成爲UDF將使其更容易在其他「字符日期」列上使用。 –

+0

Clockwork-Muse答案缺少可用於驗證日期的答案。 我已經測試過它,並且在提交了諸如「2016-02-30」或「2016-04-31」之類的無效日期時會產生錯誤。邏輯只是檢查格式,這不足以呈現給CASE語句以嘗試DATE()轉換。因此,您將上述問題視爲答案取決於您希望篩選以特定方式格式化的數據,還是試圖篩選任何無效日期(格式和值)。 – geolemon

+0

另一個答案正在討論http://stackoverflow.com/questions/37055675/validate-dates-before-conversion-aka-isdate-equivalent – Stavr00

0

我不清楚什麼是「檢查日期」的格式,我也不知道任何現有的ISDATE()效果,但名稱所暗示的內容似乎足夠清楚。考慮:

在v5r3上非常輕微地測試[即只有既確保了幾劣棗字符串示例值和一些垃圾文本輸入實際返回NULL,並且每個不同標準日期格式與有效的值返回的日期值],下列應該影響將輸入變化的字符串評估爲最多10個字符作爲可以轉換爲DATE的值;當輸入值不能轉換爲日期時,結果爲NULL。當然,這意味着最初的NULL值不能直接與生成的無效日期字符串的結果區分開來。

如果某些期望的指標(如TRUEFALSE)被期望作爲結果,則可以使用用戶定義函數(UDF)編碼CASE表達式;例如爲:
CASE WHEN ISDATE(myVCcol) IS NULL THEN 'FALSE' ELSE 'TRUE' END

DROP FUNCTION ISDATE        
;             
CREATE FUNCTION ISDATE        
(InpDateStr VARCHAR(10)       
) RETURNS DATE          
LANGUAGE SQL          
DETERMINISTIC          
RETURNS NULL ON NULL INPUT       
    SET OPTION DBGVIEW = *SOURCE , DATFMT = *ISO  
BEGIN            
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN NULL ; 
RETURN DATE(InpDateStr) ;       
END             
;