2015-09-28 100 views
0

我有以下SQL查詢到2個日期之間取得票據:SQL服務器轉換錯誤

SELECT * 
FROM BILLS 
WHERE 
    UPLOAD_DATE >= Convert(DATETIME, '2015-8-29 00:00:00', 120) 
    AND UPLOAD_DATE <= Convert(DATETIME, '2015-9-28 23:59:59', 120) 

但是,當我執行這個查詢,我獲得以下錯誤消息;從性格 字符串

轉換日期和/或時間,當我檢查的格式120和語法是yyyy-mm-dd hh-mi-ss(24小時)

轉換失敗,所以它在我看來,正確的。

任何人知道什麼是錯的?

+0

我認爲'UPLOAD_DATE'是一個varchar列,有些值的格式不正確。嘗試以下語句進行確認:'select cast(UPLOAD_DATE as DATETIME)FROM Bills'。 –

+0

這是一個日期列 – Jonas

+0

看看這篇文章的答案http://stackoverflow.com/questions/14119133/conversion-failed-when-converting-date-and-or-time-from-character-string-while-i 。你可能會有一些想法。 –

回答

6

ODBC格式對於月份和日期使用兩位數字,即2015-08-29 00:00:00而不是2015-8-29 00:00:00

雖然使用日期型參數會更好。否則,應使用明確的日期文字,不需要任何轉換,且不受排序影響。

完整的ISO 8601格式不需要轉換,例如:2015-08-29T00:00:00。未分離的日期格式也不需要轉換,例如20150829

如果UPLOAD_DATEdate列,則沒有理由指定時間部分。查詢可以寫成如下:

declare @startDate date, @endDate date 
.... 

Select * 
From BILLS 
Where UPLOAD_DATE BETWEEN @startDate AND @endDate 

如果語句是一個存儲過程的一部分,或者是通過ADO.NET調用,這是首選的方法,如:

var startDate=new DateTime(2015,8,29); 
var endDate=startDate.AddMonths(1).AddDays(-1); 

var myCmd=new SqlCommand("SELECT .... Where UPLOAD_DATE BETWEEN @startDate AND @endDate"); 

myCmd.Parameters.Add("@startDate",startDate); 
myCmd.Parameters.Add("@endDate",endDate); 
.... 

使用日期文字相同的語句可以是:

Select * 
From BILLS 
Where UPLOAD_DATE BETWEEN '20150829' AND '20150928' 

部分將只有UPLOAD_DATE需要的時間是一個datetime類型。在這種情況下,將標準更改爲小於下一個日期更容易:

Select * 
From BILLS 
Where UPLOAD_DATE >= '20150829' AND UPLOAD_DATE < '20150929' 
+0

這個技巧! – Jonas