2012-05-04 117 views
1

我收到以下錯誤「將varchar數據類型轉換爲日期時間數據類型導致out-of-範圍值「。和日期格式是「DD/MM/YY」將varchar數據類型轉換爲日期時間數據類型導致超出範圍值

public DataSet GetSynchronizeDataForDLDocs(string date_pushed) 
{ 
    DataSet ds = new DataSet(); 
    string strQuery=string.Empty; 

    if (date_pushed != null && date_pushed != string.Empty)     // 105 
     strQuery = 
      @"select 
       a.DLNO, 
       a.NAME, 
       b.TOPSTRING, 
       Convert(datetime,a.DOB,103) as DOB, 
       Convert(datetime,a.DOI,103) as DOI, 
       Convert(datetime,b.datepushed,103) as datepushed 
      from 
       PLInfo_Demo a, 
       DLInfo_Demo b 
      where 
       a.dlno=b.dlno 
      and 
       Convert(DateTime,b.datepushed,103) > CONVERT(varchar,'" + date_pushed + @"' ,103) 
      and 
       DATEPART(hh, b.datepushed) > Datepart(hh,'" + date_pushed + @"') 
      and 
       DATEPART(MI, b.datepushed) > Datepart(MI,'" + date_pushed + @"') 
      and 
       DATEPART(ss, b.datepushed) > Datepart(ss,'" + date_pushed + @"') 
      order by b.datepushed desc"; 
    else 
     strQuery = @" 
      select 
       a.DLNO, 
       a.NAME, 
       b.TOPSTRING, 
       Convert(datetime,a.DOB,103) as DOB, 
       Convert(datetime,a.DOI,103) as DOI, 
       Convert(datetime,b.datepushed,103) as datepushed 
      from 
       PLInfo_Demo a, 
       DLInfo_Demo b 
      where 
       a.dlno=b.dlno "; 
    ds = DbManager.ExecuteSalarData(
     strQuery, 
     CommandType.Text, 
     DbManager.strcon2, 
     null); 

    return ds; 
} 
+1

你認爲我們該怎麼處理這個爛攤子? – Arion

+0

@Arion這應該是更好的,但我同意 - OP不應該把他的「代碼」給別人。這是非常格式化。 – Matten

+0

@Matten:你很高興你回來了:P – Arion

回答

4

第一件事是date_pushed作爲一個字符串傳遞。解析它在你的C#(DateTime.Parse或類似的,也許指定格式和文化),並將其作爲參數傳遞。在所有有'" + date_pushed + '"'的地方,請改爲使用@theParameter

接下來的事情是存儲b.datepusheddatetime - 應該沒有必要在b.datepushed使用convert。如果它是一個字符串你做錯了

之後,您將datetime字段與datetime參數進行比較,該參數無任何問題。例如:

and Convert(DateTime,b.datepushed,103) > CONVERT(varchar,'" + date_pushed + @"' ,103) 

變得

and b.datepushed > @date_pushed 

其中b.datepusheddatetime字段,@date_pusheddatetime參數。您當然可以使用DATEPART等與datetime - 重要的一點是:它不解析任何東西。

+0

@marc_s在回答了關於日期格式的太多問題之後 - 是否有一個規範的答案,我們都可以鏈接爲重複的?例如有400個upvotes,所以我們可以避免評論中的爭論? –

0

有些一定失敗,所以請看看實際值:

Convert(datetime,a.DOB,103) as DOB, 
Convert(datetime,a.DOI,103) as DOI, 
Convert(datetime,b.datepushed,103) as datepushed 
0

我假設你使用SQL Server。

SQL Server中的有效的datetime範圍爲1753年1月1日通過12月31日,9999,在datetime (Transact-SQL) MSDN page的規定。

我建議你看看你所有的convert(datetime, ...)聲明的值落在這個範圍之外。

+0

有趣!似乎這就是爲什麼他們在varchar字段也許:) :) – V4Vendetta

+0

@ V4Vendetta - 可能:)。如果出於某種原因,您需要表示SQL允許的範圍之外的日期,那麼最好的方法就是使用C#解析日期,正如Marc Gravell在他的回答中所表明的那樣。 – GolfWolf

相關問題