2014-02-20 91 views
1

我的SQL查詢有問題。SQL查詢中的錯誤日期

錯誤是:

varchar數據類型到一個SMALLDATETIME數據類型的轉換導致的「+」外的範圍值。

我試圖用CONVERT函數來補救它,但徒勞無功。

public static List<string> Helper_Statistic_6(DateTime start, DateTime end) { 
     DateTime dateStart = start; 
     DateTime dateEnd = end; 

     string query = "SELECT ... FROM ... WHERE DATE BETWEEN CONVERT(VARCHAR(10),'" + dateStart+ "',120) and CONVERT(VARCHAR(10),'" + dateEnd+ "',120) "; 
} 
+0

我猜這是SQL Server的? –

+0

你正在使用什麼數據庫管理程序? – Smandoli

+0

你能舉一個正在使用的值的例子嗎? – Mike

回答

1

我懷疑你在C#中使用Microsoft SQL Server。

在任何情況下,爲了避免代碼注入的困擾,應該嘗試使用參數化的SQL。允許編譯器負責將C#日期編組到SQL日期。

編輯:按照@marc_s建議,你應該小心使用保留的SQL關鍵字作爲列名,否則,保護他們免受使用[]符號被當作SQL關鍵字,即 isntead的DATE

我希望的語法看起來像這樣:

public static void Run_Helper_Statistic_6(DateTime start, DateTime end) 
{ 
    using (SqlCommand command = new SqlCommand(
     "SELECT ... FROM ... WHERE [DATE] BETWEEN @start and @end", connection)) 
    { 
     command.Parameters.Add(new SqlParameter("start", start)); 
     command.Parameters.Add(new SqlParameter("end", end)); 
     SqlDataReader reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      // ... 
     } 
    } 
} 
+0

另外,請注意,'DATE'是SQL中的一個**關鍵字**,因此會產生一個非常糟糕的列名 - 如果這真的是名稱,它必須是放在方括號內:'... WHERE [日期] ...之間....或更好 - 避免這些關鍵字作爲列名! –

+0

對不起,列的真實名稱是DO_Date。 我寫得太快了... – Jayce

+0

我改變了你說的Stephen Quan,現在當我想要得到讀者的價值時,我在DateTime和String之間出現了一個轉換問題。獲取值,我這樣做:stat6.Date = DateTime.Parse(reader.GetString(0)); – Jayce