SQL語句中,Conversion failed when converting datetime from character string.錯誤的解決辦法

雲霏霏發表於2014-07-02

  在專案開發過程中,我們經常要做一些以時間為條件的查詢,比如查詢指定時間範圍內的歷史記錄,然而這些時間都是從UI傳遞過來的引數,所以我們寫的sql語句就必須用到字串拼接。當然,在C#中寫SQL語句還好處理,可以使用C#的字串函式做對應的資料型別轉換。但是,如果用的是儲存過程的話,就有點糾結了。下面來說一下我在寫儲存過程中遇到的問題:

為了更加直接的說明問題,寫如下一個簡單的例子:

 

declare @dateFrom datetime;
declare @dateTo   datetime;
declare @str nvarchar(500);
declare @strOne nvarchar(100);
declare @strTwo nvarchar(200);
declare @sql nvarchar(1000);

set @dateFrom = '2014-01-01';
set @dateTo = getdate();

set @strOne = ' and DateCreated >= ' + @dateFrom;

set @str = 'select * from Users where 1 = 1';
set @sql = @str + @strOne;

print @sql;

exec sp_executesql @sql

 

這個時候,執行SQL的話,就會出現如下錯誤:

 

分析原因,主要是因為@dateFrom資料型別為Datetime,和字串連線時型別不匹配,所以下面就來做型別轉換:

SQL Server中有個Convert函式,可以用來做型別轉換,用法如下:

定義和用法

CONVERT() 函式是把日期轉換為新資料型別的通用函式。

CONVERT() 函式可以用不同的格式顯示日期/時間資料。

語法

CONVERT(data_type(length),data_to_be_converted,style)

data_type(length) 規定目標資料型別(帶有可選的長度)。data_to_be_converted 含有需要轉換的值。style 規定日期/時間的輸出格式。

例項

下面的指令碼使用 CONVERT() 函式來顯示不同的格式。我們將使用 GETDATE() 函式來獲得當前的日期/時間:

CONVERT(VARCHAR(19),GETDATE())
CONVERT(VARCHAR(10),GETDATE(),110) 
CONVERT(VARCHAR(11),GETDATE(),106)
CONVERT(VARCHAR(24),GETDATE(),113)

結果類似:

Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635

參照上面用法,我們修改程式碼如下:

declare @dateFrom datetime;
declare @dateTo   datetime;
declare @str nvarchar(500);
declare @strOne nvarchar(100);
declare @strTwo nvarchar(200);
declare @sql nvarchar(1000);

set @dateFrom = '2014-01-01';
set @dateTo = getdate();

-- set @strOne = ' and DateCreated >= ''' + convert(nvarchar(20),@dateFrom,20) + '''';
-- set @strTwo = ' and DateCreated <= ''' + convert(nvarchar(20),@dateTo,20) + '''';

set @strOne = ' and t68DateCreated between ''' + convert(nvarchar(20),@dateFrom,20)
            + ''' and ''' + convert(nvarchar(20),@dateTo,20) + '''';

-- select * from Authors_t68 where Users between @dateFrom and @dateTo
set @str = 'select * from Authors_t68 where 1 = 1';

-- set @sql = @str + @strOne + @strTwo;
set @sql = @str + @strOne;

print @sql;

exec sp_executesql @sql

這個時候,執行,就可以查詢出結果了。兩種拼接方法,註釋掉的使用了兩個條件來限定時間範圍,後一種方法用的是between...and方法。

 

相關文章