2015-06-24 55 views
0

要開始,我得到的錯誤如下:鑄造SQL Date值沒有

varchar數據類型爲datetime數據類型的轉換導致的出範圍值。

我所做返回一組從SQL數據庫中的數據到一個DataTable,從那裏我運行在C#代碼方面的if聲明,以確定一個日期是大於其他。這對很多部署都有效,但是新服務器上的特定部署會導致上述錯誤。

這裏是我的代碼:

if 
(
    Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString()).Date > 
    Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString()).Date 
) 
{ 
    ... do stuff ... 
} 

我的理解是,該列中的數據,轉換爲字符串,失敗嘗試執行Convert.ToDateTime()

然而,令人困惑的問題是,這個時候代碼已在其他服務器上運行,並且此問題是孤立的。所以我得到它可能是唯一的服務器,但我不知道在哪裏看。

更改任何區域設置等,不幸的是不是一個選項,所以我試圖找到解決辦法!

任何幫助表示讚賞!

+0

什麼是數據庫中的日期格式?日期可能以一種格式記錄,而您的轉換正在另一種格式中運行。 – MPelletier

+1

數據庫中的*類型*是什麼?它應該是一個DateTime,這意味着你不應該轉換爲一個字符串,並根本不需要。只需使用'if((DateTime)ds.Tables [0] .Rows [0] [「StartDate」]>(DateTime)ds.Tables [0] .Rows [0] [「OriginalStartDate」]))' –

+0

雙重檢查'type'這兩個字段的類型都是DateTime。 @JonSkeet我會相應地嘗試你的建議。至於格式,它看起來像'2015-07-01 00:00:00.000' @MPelletier –

回答

3

基本上,你不應該將值轉換爲字符串,並返回首位。儘可能避免字符串轉換,除非這是您嘗試執行的重要部分。就你而言,你真的對DateTime值感興趣。它們在數據庫中爲DateTime,並且您希望它們在您的代碼中爲DateTime值,那麼爲什麼要引入字符串?

您應該能夠使用:

DataRow row = ds.Tables[0].Rows[0]; 
DateTime startDate = (DateTime) row["StartDate"]; 
DateTime originalStartDate = (DateTime) row["OriginalStartDate"]; 
if (startDate.Date > originalStartDate.Date) 
{ 
    ... 
} 
+0

謝謝喬恩。在這裏100%正確。我在基地意識到我試圖削減一些讓我頭疼的角落,當然,字符串轉換是不必要的。感謝您的洞察力。讚賞。 –

0

也許你可以試試這個嗎?

 if (Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString("yyyyMMdd HH:mm:ss")).Date > Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString("yyyyMMdd HH:mm:ss")).Date) 
     { 
       ...do stuff... 
     }