2011-07-14 35 views

回答

5

您可以使用isdate功能篩選行非日期時間字符串。此查詢返回三行,無需任何轉換錯誤:

with v as (
    select '20110714' value union all 
    select '2011-07-15' union all 
    select '3/22/2011' union all 
    select 'foo' 
) 
select cast(value as datetime) 
from v 
where isdate(value) = 1 

編輯

當你需要有一個默認vaue(如當前的日期/時間),你可以做這樣的事情:

select case when isdate(value) = 1 then cast(value as datetime) else getdate() end 
+0

對不起,你的回答和我的回答是一樣的,但我沒有從你的代碼複製。 – rahularyansharma

+0

完美。對於其他人,如果你希望它在線(例如CASE WHEN(isdate(col)= 1),那麼你也可以「case when」它然後轉換(datetime,col)ELSE 0 END)「0」會給你1900-01- 01,因此您可以用另一個值(例如'2000-01-01')替換爲默認值,並且它會自動轉換爲日期時間。 –

+0

這個答案的第一部分是不安全的。 [沒有保證](http://connect.microsoft.com/SQLServer/feedback/details/537419/sql-server-should-not-raise-illogical-errors)在項目之前處理了WHERE '。 –

0

你可以嘗試

select cast ('28/08/2006 11:23:25' as datetime) 

SELECT * FROM tab_val WHERE (CASE ISDATE(val) WHEN 1 THEN CAST(val As DateTime) ELSE NULL END) 

manual

0

中的更多詳細信息我們可以檢查該列是否具有有效日期時間,如果不是,則返回空值而不生成任何錯誤。

SELECT CASE ISDATE([YourDate]) WHEN 0 
    THEN CAST([YourDate] AS DATETIME) 
    ELSE CAST(NULL AS DATETIME) END AS [Your Date] 
    FROM [dbo].[yourtable] 
1

從SQL Server Denali中,您可以使用TRY_CONVERT。案例表達式是以前版本中唯一的safe way

相關問題