我遇到了与将日期时间从XML(ISO8601:yyyy-mm-ddThh:mi:ss.mmm)转换为SQL Server 2005日期时间相关的问题.问题是转换毫秒是错误的.我已经使用nvarchar中的convert(datetime,MyDate,126)测试了隐式和显式转换,结果是相同的:
Original Result
2009-10-29T15:43:12.990 2009-10-29 15:43:12.990
2009-10-29T15:43:12.991 2009-10-29 15:43:12.990
2009-10-29T15:43:12.992 2009-10-29 15:43:12.993
2009-10-29T15:43:12.993 2009-10-29 15:43:12.993
2009-10-29T15:43:12.994 2009-10-29 15:43:12.993
2009-10-29T15:43:12.995 2009-10-29 15:43:12.997
2009-10-29T15:43:12.996 2009-10-29 15:43:12.997
2009-10-29T15:43:12.997 2009-10-29 15:43:12.997
2009-10-29T15:43:12.998 2009-10-29 15:43:12.997
2009-10-29T15:43:12.999 2009-10-29 15:43:13.000
Run Code Online (Sandbox Code Playgroud)
我的非广泛测试显示最后一位数字是0,3或7.这是一个简单的舍入问题吗?毫秒精度很重要,失去/获得一个或两个不是一个选择.
我有一个从源(a DataRow或a SqlDataReader)获取日期属性的方法:
protected SqlDateTime GetSqlDateTimePropertyValue(string propertyName, object source)
{
var objValue = GetPropertyValue(propertyName, source);
var value = objValue == DBNull.Value ? null : (DateTime?)objValue;
var sqlValue = new SqlDateTime();
if (value.HasValue) sqlValue = value.Value;
return sqlValue;
}
Run Code Online (Sandbox Code Playgroud)
但转换似乎是稍微改变日期,以便我的测试总是失败.
有谁知道为什么这种方法会错误地转换?
在方法结束时,看起来转换为进行SqlDateTime一些舍入:
value.Value.Ticks: 634698391707468296
sqlValue.Value.Ticks: 634698391707470000
Run Code Online (Sandbox Code Playgroud) 我以下列方式插入客户.
DateTime d = DateTime.Now;
foreach(Customer cus in CustomerList)
{
cus.EntryDate = d;
}
SaveToDatbase(CustomerList);
Run Code Online (Sandbox Code Playgroud)
使用正确的输入日期成功保存日期,但是当我检索数据并将其与变量d进行比较时,它不匹配.
foreach(Customer cus in GetFromDatabase())
{
Response.Write(DateTime.Compare(cus.EntryDate, d));
}
Run Code Online (Sandbox Code Playgroud)
输出为1而不是0.我检查了插入的数据,它与d变量值匹配,毫秒.日期存储在sql server数据库中.我意识到的一件事是,如果我为cus.EntryDate和d重置毫秒为0,则输出为0.我在这里做错了什么?