代码改变世界

SmallDateTime时间范围检查

2014-04-22 14:50 Franz 阅读(...) 评论(...) 编辑 收藏

SamllDataTime是SQL Server中的一种表达时间的类型, 精度不高但是省空间,具体的细节就查看一下MSDN的文档吧. http://msdn.microsoft.com/zh-cn/library/ms182418.aspx

这里着重看一下它的时间范围从1900-01-01 到 2079-06-06.

首先展示一段系统中的代码, 你能发现其中的问题么?

SqlCommand command = new SqlCommand(sqlTemplate, conn);
//....
command.Parameters.Add(new SqlParameter("@LogClientTime", SqlDbType.SmallDate;
command.Parameters.Add(new SqlParameter("@LogServerTime", SqlDbType.SmallDate;
//....
foreach (var hourlySummaryData in _summaryData)
{
    //....
    command.Parameters["@LogClientTime"].Value = 
    hourlySummaryData.LogClientTime < SqlDateTime.MinValue ? SqlDateTime.MinValue : hourlySumma.Value.LogClientTime;
    command.Parameters["@LogServerTime"].Value = 
    hourlySummaryData.LogServerTime < SqlDateTime.MinValue ? SqlDateTime.MinValue : hourlySumma.Value.LogServerTime;
    //....
    command.ExecuteNonQuery();
}

 

系统中的时间未检查hourlySummaryData.LogClientTime的上限是不, 的确是个bug. 但是这不是我想说,这里还有一个bug.

SqlDateTime.MinValue的值是1753/1/1 0:00:00. 知道问题出在哪里了吧. 

.NET BCL中并没有任何一个公共静态字段时间是1900/1/1 (私有的还是有的, 比如SqlDateTime中的SQLBaseDate字段.)

所以使用的时候一定要特别的注意, 如果数据库中使用了SmallDateTime那么范围检查一定要自己手写一下. SqlDateTime.MinValue跟MaxValue不是给SmallDateTime用的, 是datetime的范围检查(1753 年 1 月 1 日到 9999 年 12 月 31 日).