我收到一个包含以下值的字符串:
0001-01-01T12:30:00
保存到数据库时我只需要时间部分。
但我无法将{{1>}年保存在 MSSQL Server (字段为0001
类型)中,因为它需要 1900 + 。
目前我检查年份是什么,并使用以下代码重新创建日期:
SmallDateTime
是否有更简单的方法来使用年份设置为0001的日期格式?
我不知道我导入的所有可能具有此值的字段,我不想为所有字段添加此代码。
答案 0 :(得分: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)
答案 1 :(得分:1)
如果时间部分是你所关心的,那么你所拥有的是最好的事情。由于日历问题,即使SQL Server中的常规DateTime
数据类型也只能返回到1753.
如果您想要一个基本上不受约束的日期数据类型,它将接受从0001开始的年份,那么请使用DateTime2
答案 2 :(得分: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线):
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 ;
我认为这使得意图更加清晰;