2013-08-28 39 views
0

我收到一個字符串以下值:演員字符串日期和改變0001年至1900年

0001-01-01T12:30:00 

保存到數據庫時,我只需要時間部分。

但我不能保存0001MSSQL服務器(場SmallDateTime型),因爲它需要1900+

目前我入住的一年是什麼,使用下面的代碼重新創建日期:

... 
DateTime i = Convert.ToDateTime("0001-01-01T12:30:00"); 
DateTime d = new DateTime(1900, 1, 1, i.hour, i.minute, i.seconds); 

是否有使用其中year設置爲0001的日期格式更簡單的方法?

我不知道我正在導入的所有可能具有此值的字段,我不想爲所有字段添加此代碼。

+0

爲什麼不把它設置爲NULL? –

+3

您使用的是哪個版本的SQL Server?爲什麼不放棄無用日期部分,只使用'TIME'數據類型? –

+0

對於Aaron的建議+1。在C#中,爲此使用'TimeSpan'類型。你可以從'yourDateTime.TimeOfDay'得到它 –

回答

3

可以將DateTime.Add()方法與DateTime.TimeOfDay屬性結合使用。

如果這是一個常規的SQL datetime你可以使用SqlDateTime.MinValue助手,並添加你的日期時間。

SqlDateTime.MinValue.Value.Add(Convert.ToDateTime("0001-01-01T12:30:00").TimeOfDay) 

對於smalldatetime您可以創建自己的。

new DateTime(1900, 1, 1).Add(Convert.ToDateTime("0001-01-01T12:30:00").TimeOfDay) 
1

如果時間部分是你所關心的,那麼你擁有的是最好的事情。由於日曆問題,即使SQL Server中常規的DateTime數據類型也只能返回到1753年。

如果你想基本上不受約束的日期數據類型將接受年開始在0001,然後使用DateTime2

1

如果你不關心的日期部分,這應該做你:

public static DateTime String2SqlAcceptableDateTimeValue(string iso8601DateTimeValue) 
{ 
    CultureInfo ci = CultureInfo.InvariantCulture ; 
    DateTime timestamp ; 
    bool converted = DateTime.TryParseExact(iso8601DateTimeValue , "yyyy-MM-ddTHH:mm:ss" , ci ,DateTimeStyles.None, out timestamp) ; 

    if (!converted) throw new ArgumentException("Not an ISO 8601 Date/Time value" , "iso8601DateTimeValue"); 

    DateTime epoch = new DateTime(1900,1,1) ; 
    DateTime sqlAcceptableValue = epoch + timestamp.TimeOfDay ; 

    return sqlAcceptableValue ; 
} 

它可能更容易拋出從轉換到DateTime轉換的日期組件。這使得它成爲一線(好,二線):

CultureInfo ci = CultureInfo.InvariantCulture ; 
string tod = "0001-01-01T12:34:56".Substring(11) ; 
DateTime dtx = new DateTime(1900,1,1) + DateTime.ParseExact(tod,"HH:mm:ss",ci).TimeOfDay ; 

我認爲這使得意圖更清晰;

相關問題