2014-05-14 141 views
1

我在這裏研究了所有類似的問題,它們都不起作用,可能是什麼問題?我想VARCHAR轉換爲日期在tsql中將varchar轉換爲datetime

convert(date,substring(replace(ent.Value,' ',''),1,10),103) < '20140101' 

它返回的錯誤從字符串轉換日期和/或時間時 轉換失敗。這裏

ent.Value是像'28/02/2014' 其實它的工作原理,當我輸入類似

轉換(日期,子('28/02/2013' ,1,10), 103)<「20140101」

,但它並不直接從工作表中

感謝

+0

ent.Value是一個日期,日期時間或varchar? – Ryx5

+0

我想這是varchar –

+0

也許ent.value有一些需要修剪的空白。 –

回答

2

爲VARCHAR轉換爲datetime:CONVERT(Datetime, '28/02/2014', 103)返回日期時間像February, 28 2014 00:00:00+0000

爲時間值轉換爲varchar:CONVERT(VARCHAR(10), datetime_field, 103)一些回報像'28/02/2014'

在這兩種情況下,你不能把它比作這種文字的:'20140101'

您可以更改文本,以便雙方的信息是ISO,如:CONVERT(VARCHAR(10), CONVERT(Datetime, ent.Value, 103), 103) < '01/01/2014'

或者REPLACE(ent.Value,'/','') < '01012014'

但我不認爲這是良好的比較VARCHAR =>你也可以做這樣的事情:CONVERT(DATETIME, '20140101',112):

CONVERT(Datetime, ent.Value, 103) < CONVERT(Datetime, '20140101', 112) 

所以你的兩個領域都在Datetime中。例如:SQLFIDDLE DEMO

2

它分解一下:第一次轉換正常工作與給定的例子日期字符串,但隨後您嘗試將DATE與進行比較需要隱式轉換。這絕不是一個好兆頭。然而,這實際上是有效的,所以除了這個機會,你有一個日期存儲在文本格式不是有效的日期。由於您的示例使用英國日期格式,因此您可能在那裏有一個美國日期(2013年2月28日 - 年/月/日)。如果您的默認日期格式爲英國式(即您未使用美式英語設置),那麼它將因超出範圍而失敗。您可能還有其他日期不符合日期的條目,例如wibble或格式不正確的日期,例如02 Fub 2013

基本上,你在你的表中的達夫日期的地方,你就需要跟蹤。作爲文本存儲的日期是一個詛咒,不惜一切代價避免(雖然我明白,當你繼承一個遺留系統時,並不總是可能的 - 我一直在那裏)。

編輯

要找到您可能劣棗試試這個:

SELECT * FROM MyTable WHERE ISDATE(MyDateAsTextCol) <> 1 
相關問題