2012-04-23 90 views
1

我有一個存儲過程,需要一個字符串參數的日期。 。在外觀來與數據庫中的日期爲保存形式2012-02-26 06:00:00.000(時間是附屬於他們的形式yyyy-MM-dd的數據當我運行SQL它始終沒有返回值,因爲它無法找到一個比較:比較字符串日期到日期時間

'select t_typday from ' + @dbName+ '.dbo.Calendar ' + 
' where T_date LIKE ''' + @dateFilter + '%'''; 
+2

您存儲日期時間值_strings _ ??? – Oded 2012-04-23 14:40:35

+1

更重要的問題是:爲什麼你根據日期時間字段傳遞字符串?相反,使用類型爲「datetime」的參數(恐怕你也可以打開SQL注入)。 – 2012-04-23 14:41:06

+0

會解決我的比較問題嗎? – 2012-04-23 14:42:11

回答

1

您需要將日期轉換在表中的yyyy-mm-dd hh:mi:ss.mmm日期。在comparin之前的格式使用LIKE該格式的字符串參數g它:

要解決以最小的改變現有代碼,改變T_dateCONVERT(VARCHAR(50),T_date,121),生產:

'select t_typday from ' + @dbName+ '.dbo.Calendar ' + 
' where CONVERT(VARCHAR(50),T_date,121) LIKE ''' + @dateFilter + '%'''; 

如果不執行轉換,你是比較一個本地格式字符串(基於@@LANGUAGE設置),如Apr 12 2012 12:00AM與您的@dateFilter字符串包含,例如,2012-04-12。這就是爲什麼比較不起作用。

當然,將DATE類型的參數傳入存儲過程將會是一個更好的解決方案,因爲有幾條評論已經提到。這將使你在@dateFilter比較日期T_dateDATE值傳遞使用一個簡單的表達,如:

CONVERT(DATE,T_date)[email protected] 
+0

如何將這個動態sql更改爲@dateFilter作爲日期時間? – 2012-04-23 14:54:24

+0

您可以通過'CONVERT(DATETIME,@ dateFilter)'在存儲過程中進行轉換,或者只是將存儲過程本身中的參數類型更改爲類型'DATETIME'而不是'VARCHAR(50)'或者其他任何是。如果您只想將日期作爲過濾器,請將參數設置爲「DATE」類型的存儲過程,然後使用簡單的「CONVERT(DATE,T_date)= @ dateFilter」進行比較。 – 2012-04-23 14:55:19

1

你需要使用一個明確的日期格式 - 這一點不能被解釋爲幾個可能的日期

見選項thisthis