2012-07-31 86 views
11

我對從Excel文件導入的數據運行SQL語句。 在這個SQL中,我正在檢查用戶是否使用IsDate函數正確輸入了日期。由於這是尚未轉換的原始數據,因此所有日期都存儲在varchar數據類型字段中。SQL中的IsDate函數將無效日期評估爲有效

在某些情況下,當用戶輸入的日期格式明顯不正確時,IsDate會返回1(有效日期)。

例如:

07/001/2012 

2012-07-002 

007/002/2012 

如何處理這個問題有什麼建議?

SELECT * 
    FROM tblImport 
WHERE (ISDATE(dt) = 0 
     AND (dt is not null AND dt <> '')) 

謝謝!

p.s.打擊用戶'沒有幫助。

+0

沒有c#。 SQL View,它返回具有無效日期的記錄。 – ssokol91 2012-07-31 17:45:54

回答

21

我做了很多的數據轉換工作的,這裏是我創建並使用它每天幾乎淘汰了劣棗的函數:

CREATE FUNCTION dbo.fnCheckDate 
(@InDate nvarchar(50)) 
RETURNS DATETIME 
AS 
    BEGIN 
     declare @Return DATETIME 

     select @return = CASE WHEN ISDATE(@InDate) = 1 
          THEN CASE WHEN CAST(@InDate as DATETIME) BETWEEN '1/1/1901 12:00:00 AM' AND '6/6/2079 12:00:00 AM' 
            THEN @InDate 
            ELSE null 
            END 
          ELSE null 
          END 
     return @return 
    END 
GO 

結果:

SELECT dbo.fnCheckDate('07/001/2012') --> Returns 2012-07-01 00:00:00.000 
SELECT dbo.fnCheckDate('2012-07-002') --> Returns 2012-07-01 00:00:00.000 
SELECT dbo.fnCheckDate('007/002/2012') --> Returns 2012-07-01 00:00:00.000 
SELECT dbo.fnCheckDate('00/002/2012') --> Returns Null 
SELECT dbo.fnCheckDate('006/031/2012') --> Returns Null 
SELECT dbo.fnCheckDate('') --> Returns Null 
+1

這太棒了! 謝謝! – ssokol91 2012-07-31 18:01:51

+2

+1,但爲什麼你在1/2/2030結束SQL smalldatetime去2079-06-06 – Paparazzi 2012-07-31 21:07:11

+1

因爲到2030年我會很長時間被埋沒(LOL)!我所處理的所有數據都是歷史數據,因此我不必擔心未來的日期,但重要的一點。 – 2012-07-31 21:20:52

1

也許只是檢查dt的LEN?但是,當len有效時它不能處理這些情況。也許輸入驗證應該發生在前端?

+0

輸入驗證是我的第一道防線。不幸的是,由於所有的數據輸入都是在Excel文件中完成的,而且我們都知道用戶的粗心大意,所以根本不可能。 – ssokol91 2012-07-31 17:36:57

6

嘗試設置首先是dateformat - 當我看到異常時,這對我很有用。

set dateformat dmy 
select IsDate(<column>) 
from Table