2014-04-14 48 views
3

我試圖運行SQL查詢的錯誤轉換但是我得到一個錯誤SQL服務器:varchar數據類型

varchar數據類型到datetime數據類型的轉換導致的超出範圍的價值。

代碼:

SELECT 
    ClientId, 
    DatePassed, 
    Lender 
FROM 
    dbo.tbl_Profile_Mortgage 
WHERE 
    DatePassed = '2011-04-28 00:00:00.000' 

我已經轉換數據類型爲使

SELECT 
    ClientId, 
    Convert (Date, DatePassed) 
    Lender 
FROM 
    dbo.tbl_Profile_Mortgage 
WHERE 
    DatePassed = '2011-04-28 00:00:00.000' 

然而,這仍然給了我同樣的錯誤

DatePasseddatetime null

任何建議,將不勝感激

+0

它大概有您的毫秒的麻煩。另外,在你的查詢中做'date ='不是很有效。通常你會想要做一個範圍,比如午夜和午夜之間。 – paqogomez

+0

嘿Paqogomez我已經嘗試過'2011-04-28 00:00:00.000'和'2011-04-28 23:59:59.000'之間的DatePassed我仍然收到錯誤 – RustyHamster

+0

毫秒呢? –

回答

3

從概念上講,你認爲where子句之前執行convert()。但是,這不一定是如何運行查詢。唯一保證執行順序的SQL語句是case(然後不是所有時間)。

你可以試試這個:

SELECT ClientId, 
     (case when isdate(DatePassed) = 1 then Convert (Date, DatePassed) end), 
     Lender 
FROM dbo.tbl_Profile_Mortgage 
WHERE DatePassed = '2011-04-28 00:00:00.000'; 

編輯:

鑑於DatePassed已經在日期時間格式,那麼你的錯誤是極不尋常的。這不是轉換此列的問題,因爲不涉及varchar

我唯一能想到的就是常數。也許你對默認日期有一個奇怪的設置,並且它試圖獲得第28個月的第4天。如果是這樣,你可以很容易地通過把在顯式轉換與格式解決這個問題:

SELECT ClientId, 
     Convert(Date, DatePassed), 
     Lender 
FROM dbo.tbl_Profile_Mortgage 
WHERE DatePassed = convert(date, '2011-04-28 00:00:00.000', 121); 

阿龍貝特朗有這個問題在他的blog一個相當廣泛的討論。順便說一句,即使我認識到他提到的YYYY-MM-DD格式的問題,我仍然默認使用它。我認爲這是微軟選擇不承認ISO標準格式的錯誤(但僅僅因爲我認爲這是一個錯誤並不一定能說服任何人)。

+0

此外,不惜一切代價避免隱式轉換。它可能無法解決您的問題,但將DatePassed ='2011-04-28 00:00:00.000''更改爲DatePassed = CAST('2011-04-28 00:00:00.000'AS DATETIME)'是一種好的做法。 –

+0

嗨戈登這仍然給我的錯誤'一個varchar數據類型轉換爲日期時間數據類型導致超出範圍的值。 – RustyHamster

2

SQL Server支持多種格式 - 請參閱MSDN Books Online on CAST and CONVERT。這些格式中的大多數是,依賴於,因此您可以設置哪些設置 - 因此,這些設置可能會工作一些 - 有時不會。我想你的情況是,你正在使用的語言設置,只是簡單的不適用於你正在使用的字符串文字。

解決這個問題的方法是使用(稍作改動)ISO-8601日期由SQL Server支持的格式 - 這種格式的作品總是 - 不管你的SQL Server的語言和日期格式設置。

ISO-8601 format由SQL Server支持有兩種形式:

  • YYYYMMDD只是日期(沒有時間部分);請注意:沒有破折號!,這非常重要! YYYY-MM-DD不是獨立於您的SQL Server中的dateformat設置,並將在所有情況下工作!

或:

  • YYYY-MM-DDTHH:MM:SS的日期和時間 - 這裏需要注意:這種格式破折號(但他們可以可省略),並固定T的日期和時間之間的分隔符你的部分DATETIME

這對SQL Server 2000及更新版本有效。

如果你使用SQL Server 2008或更高版本和DATE數據類型(僅DATE - !DATETIME),那麼你的確可以同時使用YYYY-MM-DD格式,將工作,也與任何設置在你的SQL Server 。

不要問我爲什麼這整個話題如此棘手,有點令人困惑 - 這就是它的方式。但使用YYYYMMDD格式,對於任何版本的SQL Server以及SQL Server中的任何語言和dateformat設置,都應該可以。

如果您只需要日期部分,則SQL Server 2008及更新版本的建議是使用DATE;如果需要日期和時間,則建議使用DATETIME2(n)。如果可能,您應該嘗試開始逐步淘汰DATETIME數據類型。

在你的具體情況 - 在你的WHERE子句中使用此字符串:

WHERE DatePassed = '2011-04-28T00:00:00.000'; 

通知的日期和時間部分之間的字面T