2013-10-25 108 views
0

我運行此查詢轉換日期時間爲NULL值

select * from dbo.CHARGES m 
LEFT JOIN Docs z ON z.DocId=m.DocId 
AND CHARGE_DATE=CAST(z.DocDate + z.DocTime AS DATETIME) 

並得到Conversion failed when converting date and/or time from character string,因爲DocDate, DocTime一些行具有空值

這裏DocTime爲varchar(5)

如何我可以通過忽略NULL或錯誤值來運行此查詢嗎?

+0

問題是...? –

+2

「,因爲DocDate,DocTime的某些行有空值」不,那不是。這是因爲您在列中的數據會創建一個不能很好地轉換爲日期時間的字符串。 –

+0

DocDate是什麼格式的日期?您可能需要使用SQL-Server的[CONVERT](http://msdn.microsoft.com/en-us/library/ms187928.aspx)而不是'CAST',以便您可以指定樣式,並分別轉換每個部分。例如'CONVERT(DATETIME,z.DocDate,103)+ CONVERT(TIME,z.DocTime)' – GarethD

回答

1

試試這個代碼,查詢取決於你的必要性。

空值

select * from dbo.CHARGES m 
LEFT JOIN Docs z 
    ON z.DocId=m.DocId 
    AND (
     z.DocDate IS NULL 
     OR z.DocTime IS NULL 
     OR CHARGE_DATE=CAST(z.DocDate + z.DocTime AS DATETIME) 
    ) 

沒有NULL值

select * from dbo.CHARGES m 
LEFT JOIN Docs z 
    ON z.DocId=m.DocId 
    AND (
     NOT z.DocDate IS NULL 
     AND NOT z.DocTime IS NULL 
     AND CHARGE_DATE=CAST(z.DocDate + z.DocTime AS DATETIME) 
    ) 
+2

我真的不明白這個答案。 –

+0

在此解決方案中,只有在兩個字段都不爲空時才使用日期過濾器。 –

4

如果你的字符串格式yyyy-MM-dd hh:mm那麼你的轉換表達式將是這樣的:

SELECT CONVERT(DATETIME, ISNULL(DocDate, '1900-01-01') + ' ' + ISNULL(DocTime, '00:00'), 121) 

然而,它可能適合於檢查它實際上是一個日期,然後再嘗試合作nvert它:

SET DATEFORMAT YMD; 

SELECT DocDate, 
     DocTime, 
     Formatted = CASE WHEN ISDATE(ISNULL(DocDate, '1900-01-01') 
           + ' ' + ISNULL(DocTime, '00:00')) = 1 

          THEN CONVERT(DATETIME, ISNULL(DocDate, '1900-01-01') 
           + ' ' + ISNULL(DocTime, '00:00'), 121) 
         ELSE NULL 
        END 
FROM (VALUES 
      ('2013-10-01', '17:30'),-- CORRECT FORMAT 
      ('2013-10-01', NULL), -- NULL TIME 
      ('2013-13-10', '17:30'), -- INVALID DATE 
      ('2013-01-05', 'XX:30'), -- INVALID TIME 
      (NULL, '17:00')   -- NULL DATE 
     ) t (DocDate, DocTime); 

注意,我已經設置,即使它被設置在轉換中的日期格式,這是爲ISDATE()利益,如果日期格式不這樣設置的,它可能會認爲2013-13-10是一個有效的日期(2013年10月13日),但會在轉換時發生錯誤。

如果/當你升級到SQL-Server 2012中,你可以簡單地使用TRY_CONVERT

SET DATEFORMAT YMD; 
SELECT DocDate, 
     DocTime, 
     Formatted = TRY_CONVERT(DATETIME, ISNULL(DocDate, '1900-01-01') 
           + ' ' + ISNULL(DocTime, '00:00'), 121) 
FROM (VALUES 
      ('2013-10-01', '17:30'),-- CORRECT FORMAT 
      ('2013-10-01', NULL), -- NULL TIME 
      ('2013-13-10', '17:30'), -- INVALID DATE 
      ('2013-01-05', 'XX:30'), -- INVALID TIME 
      (NULL, '17:00')   -- NULL DATE 
     ) t (DocDate, DocTime); 

Examples on SQL Fiddle

我不縱容這種做法,(因爲我有一個評論)會強烈建議糾正問題(將數據存儲爲錯誤類型),而不是繞過數據錯誤。

相關問題