2011-10-07 39 views
43

我似乎無法將sqldatatime.minvalue轉換爲日期時間對象。如何將sqldatetime.minvalue轉換爲datetime?

我想:

Datetime dt = Convert.ToDateTime(SqlDateTime.MinValue); 

這顯然沒有奏效。

+0

感謝您的支持。你的代碼幫助我讀取SQL返回'DateTime dateValue = Convert.ToDateTime(reader.GetValue(8));' – 2012-10-10 22:39:18

回答

62

任何理由不僅僅使用explicit conversion operator

DateTime dt = (DateTime) SqlDateTime.MinValue; 

這對我的作品:

using System; 
using System.Data.SqlTypes; 

class Test 
{ 
    static void Main() 
    { 
     DateTime dt = (DateTime) SqlDateTime.MinValue; 
     Console.WriteLine(dt); 
    } 
} 
+0

爲什麼會這樣工作,而不是Convert.ToDateTime()奇怪的沒有? – codecompleting

+4

@codecompleting,'Convert.ToDateTime'需要一個適當的重載來支持'SqlDateTime'的值。 'Convert'的設計者一定沒有考慮過[足夠重要],而'SqlDateTime'的設計者確實做到了。 –

126

無需轉換。 SqlDateTime有一個Value財產,返回DateTime

DateTime dt = SqlDateTime.MinValue.Value; 
+30

Jon Skeets有一個更好的答案,這是一個罕見的問題:-) – PeteT

+1

我沒有看到即將到來的。 –

14

您收到的答案向您顯示了兩種不同的方式來轉換值。一種是使用爲SqlDateTimeDateTime定義的明確轉換,另一種是訪問SqlDateTime實例上的.Value屬性,該實例返回DateTime

var date = theSqlDate.Value; // via property 
var date = (DateTime)theSqlDate; // via explicit conversion 

有一些值得考慮的折衷。 SqlDateTime通過值SqlDateTime.Null支持數據庫中空值的概念(DBNull,由另一個現在已刪除的答案引用)。如果您訪問「null」實例上的Value屬性,則會遇到SqlNullValueException。另一方面,顯式轉換爲DateTime導致{January 1, 1900 12:00:00 AM}。這些結果在你的代碼中都不需要。使用非空默認值覆蓋數據庫中的有效空條目可能與在運行時獲取異常一樣糟糕。

如果您在數據庫中有一個可爲空的列,並且您正在使用SqlDateTime,則可能需要以不同方式明確測試並處理SqlDateTime.Null,然後使用哪種方法轉換其他值可能無關緊要。

DateTime? date; 
if (theSqlDate.Equals(SqlDateTime.Null)) 
    date = null 
else 
    date = theSqlDate.Value; // or (DateTime)theSqlDate; 
+5

這比一個比Jon Skeet更好的答案要好得多。 –