2017-07-14 29 views
0

我有一個名爲Cases的主表,我正在將數據插入。我有一個替代表,其中存儲了名爲rawTableData的所有原始數據,然後將其發送到主表。從具有潛在錯誤日期字符串的大記錄表中將nvarchar轉換爲datetime

我在rawTableData一個nvarchar列,在這種格式

2016-04-04-10.50.02.351232 

我在Cases表中的列具有的DATETIME數據類型存儲日期時間字符串。

我第一次嘗試找到下面

SELECT CONVERT(datetime, nvarcharDateColumn, 103) 
FROM rawTableData 
WHERE ISDATE(CONVERT(datetime, nvarcharDateColumn, 103)) != 1 

在這種方法中,壞數據和我得到以下

錯誤nvarchar數據類型到datetime數據類型的轉換導致的出範圍值。

然後我嘗試了不同的方法,希望能找到所有的超出範圍的值

SELECT nvarcharDateColumn 
FROM rawTableData 
WHERE ISDATE(nvarcharDateColumn) 

但是,只有返回自nvarchar的所有行。

再次,我堅持下來了,並嘗試了不同的方法

SELECT CONVERT(DATETIME, CASE WHEN ISDATE(nvarcharDateColumn) = 1 THEN nvarcharDateColumn END, 103) 
FROM rawTableData 

我不知道我在做什麼錯在這裏和任何幫助,將不勝感激。

我使用SQL Server 2012的

+1

'則IsDate ()'是衆所周知的不準確的,並且將日期存儲爲字符串並沒有真正的幫助。既然它是說它導致了一個超出範圍的值,那麼你有沒有比1753-01-01更早的日期? – Siyual

+0

@Siyual沒有範圍是在2013-2017之間,我認爲其中一些日期可能是美國和英國 – imBlue

+0

這可能是問題所在 - 如果您將兩種格式的日期存儲在同一個字段中,則無法確定這是哪個(ISO標準是'yyyy-MM-dd') – Siyual

回答

0

您可以使用TRY_CONVERT

SELECT nvarchardatecolumn, TRY_CONVERT(date, nvarchardatecolumn) 
FROM rawTableData 

如果你只想要回無效日期,使用派生表:

SELECT * 
FROM (SELECT nvarchardatecolumn, TRY_CONVERT(date, nvarchardatecolumn) DateCheck 
     FROM rawTableData 
    ) A 
WHERE DateCheck IS NULL 
+0

問題是它將返回所有它們爲空,因爲它們是nvarchar,但我似乎無法將其轉換爲日期時間 – imBlue

+0

Nvarchar可以轉換爲日期就好了......如果它返回所有「NULL」,則意味着他們都沒有在一個正確的日期格式。 –

+0

你可能會做些什麼,我只是檢查有工作日期時間值的列,並與我在列nvarchardatecolumn中有一個不應該有的行相比,看起來像是這個問題。 2016-04-04(--->) - (<---)10.50.02351232 – imBlue

相關問題