2010-03-22 146 views
0

我需要在特定日期之間取數據。但我得到以下錯誤。將varchar值xxx轉換爲數據類型int時轉換失敗

AdsDateStarted:2010年3月18日01:51:38.000 AM AdsDateENded:2010年9月13日05:00:00.000 PM

formatdate功能今天的日期轉換爲2010年3月22日的格式。

SQL = "SELECT * FROM Ads" 
SQL = SQL & " WHERE AdsActive = 1 AND AdsAreasID = "& rtt &" AND CONVERT(VARCHAR(10), AdsDateStarted, 101) <= "& formatdate(Date()) &" AND CONVERT(VARCHAR(10), AdsDateEnded, 101) >= "& formatdate(Date()) &"" 
Set kdFonksiyon = objConn.Execute(SQL) 

回答

0
  • 使用DateTime類型的參數,請不要放在一起的日期和時間作爲字符串。
  • ,如果你要做到這一點,使用被接受everywhree國際形式:2010-03-22

你的問題是客戶端和服務器之間的最有可能的不同的語言環境。您格式爲3/22,服務器理解「第22個月的第3天」。

如上所述,這是通過使用語言中立iso格式的參數繞過的。

+0

不,問題是日期根本不會被解析爲日期,而是作爲數字表達式。我的答案是。 – Guffa 2010-03-22 14:26:20

1

其中一個直接的問題是,您需要將單引號括在您連接到SQL字符串中的日期值周圍。另外,儘量避免使用標準ISO格式的任何日期時間轉換問題,如:yyyy-mm-dd

但是,我強烈建議您參數化查詢,而不是像這樣動態構建它。因此,例如...

SQL = "SELECT * FROM Ads WHERE AdsActive=1 AND AdsAreasID = @rtt AND....." 

然後將值作爲參數傳遞給查詢。這將有助於性能(執行計劃重用)和安全性(有助於防止SQL注入)。

2

原因是你忘記了日期周圍的撇號,所以你會得到像3/22/2010這樣的表達式,而不是像'3/22/2010'這樣的日期文字。表達式求值爲一個int值,因此數據庫會嘗試將varchar值轉換爲int值以便比較它們。

而不是將查詢中的日期作爲字符串插入,您應該使用參數。然後,您不必擔心撇號,但更重要的是,您不必猜測數據庫可能接受的日期格式。

由於您將日期用作字符串,因此現在將代碼字符串解析爲日期沒有問題,但由於您選擇的日期格式與字符串無法比較,因此您的比較將無法正常工作。如果您想將日期作爲字符串進行比較,則必須使用2010-03-22這種與字符串相當的ISO 8601格式,或者最好將日期作爲正確的日期進行比較,速度更快。 (如果可以使用索引,速度更快)

+0

可能是的。我忽視了這個問題。 – TomTom 2010-03-22 12:50:24

+0

@TomTom:不僅僅可能。 – Guffa 2010-03-22 14:31:11

0

SQL Server將'yyyyMMdd hh:mm:ss'識別爲有效的日期時間並允許您以此格式進行比較。所以如果你的formatDateTime函數返回yyyyMMdd格式的日期。您無需在AdsDateStarted上進行轉換& AdsDateEnded。

例子:
SELECT * FROM Ads WHERE AdsDateStarted > '20100101' AND AdsDateEnded <= '20100321 11:59:59'

該查詢將檢索所有匹配日期條件的記錄。

相關問題