对于 .NET DateTime 类型,为什么推断的数据库类型是 SqlDbTypes.DateTime 而不是 SqlDbTypes.DateTime2?(见http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx)
通过默认为不太精确的 SQL DateTime 类型,.NET 框架保证,默认情况下,您通过具有未指定 SqlDbType 的 SqlParameter 对象传递的任何 .NET DateTime 值肯定会因精度降低而损坏。这是一个糟糕的设计决定,IMO,考虑到仅仅保留全部价值不会有更糟糕的后果。
例如,我不能使用 SqlParameterCollection.AddWithValue 方法,因为在传递 DateTime 值时,该值会被截断为范围非常有限的 SQL DateTime 值。结果是:
由于 .NET DateTime 在精度和范围上最接近于 SQL Server 2008 数据类型“datetime2(7)”,为什么框架将 SqlParameter 值转换为 SQL DateTime,以及有什么方法可以更改默认行为所以我仍然可以使用类型推断功能吗?
我能看到的唯一建议是该功能已损坏,我应该始终明确指定数据类型,这将需要大量代码更改。我想如果框架只是保留 .NET DateTime 值的原始值,问题会更少。如果数据库字段类型恰好是不太精确的 SQL DateTime 类型,那么传递给查询的日期/时间字符串值将被数据库引擎截断。如果超出范围,您将如预期的那样收到错误消息。更重要的是,如果数据库字段类型是datetime2,那么一切都会顺利进行,记录也会正确匹配。
我有以下LINQ来查询数据库并从特定日期检索已删除的产品.
return _myDbEntities.Log
.Where(p => p.Action.Equals("Deleted") &&
(p.ActionDate > fromDate))
.Select(p => new DeletedProduct()
{
ProductId = p.ProductId,
ActionDate = p.ActionDate
}).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,当fromDate来自日期= {12/8/2016 11:41:00 AM}时,查询正在检索诸如product.ActionDate.Value = {12/8/2016 11:41:00 AM}之类的值.
查询清楚地说大于.这里发生了什么?
declare @data datetime
set @data = '2011-01-01 23:59:59:999'
select @data
Run Code Online (Sandbox Code Playgroud)
结果是:
2011-01-02 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
第二个例子:
declare @data datetime
set @data = '2011-01-01 23:59:59:999'
select 1 where @data >= '2011-01-02 00:00:00:000'
Run Code Online (Sandbox Code Playgroud)
结果
1
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么以及如何使其正确?
问题出在sql server 2008中
我错过了不使用新的DateTime2数据类型的理由吗?
例如,迁移到另一个数据库系统或将其与其他技术集成时是否会导致问题?