如果你的字符串格式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
我不縱容這種做法,(因爲我有一個評論)會強烈建議糾正問題(將數據存儲爲錯誤類型),而不是繞過數據錯誤。
問題是...? –
「,因爲DocDate,DocTime的某些行有空值」不,那不是。這是因爲您在列中的數據會創建一個不能很好地轉換爲日期時間的字符串。 –
DocDate是什麼格式的日期?您可能需要使用SQL-Server的[CONVERT](http://msdn.microsoft.com/en-us/library/ms187928.aspx)而不是'CAST',以便您可以指定樣式,並分別轉換每個部分。例如'CONVERT(DATETIME,z.DocDate,103)+ CONVERT(TIME,z.DocTime)' – GarethD