0

我收到一个具有以下值的字符串:

0001-01-01T12:30:00

保存到数据库时我只需要时间部分。

但我无法在MSSQL Server0001中保存年份(字段为类型),因为它需要1900+SmallDateTime

目前我检查年份是什么并使用以下代码重新创建日期:

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

有没有更简单的方法来使用年份设置为 0001 的日期格式?

我不知道我正在导入的所有可能具有此值的字段,并且我不想为所有字段添加此代码。

4

3 回答 3

3

您可以将该DateTime.Add()方法与该DateTime.TimeOfDay属性结合使用。

如果这是一个常规 SQL datetime,您可以使用SqlDateTime.MinValue帮助器,并将您的 DateTime 添加到其中。

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)
于 2013-08-28T20:23:47.677 回答
1

如果时间部分是您所关心的,那么您所拥有的就是最好的选择。由于日历问题,即使 SQL Server 中的常规DateTime数据类型也只能追溯到 1753 年。

如果您想要一个基本上不受约束的日期数据类型,它将接受从 0001 开始的年份,然后使用DateTime2

于 2013-08-28T20:26:35.437 回答
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. 这使它成为 1-liner(嗯,2-liner):

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 ;

我认为这使意图更加清晰;

于 2013-08-28T21:05:58.803 回答