zoukankan      html  css  js  c++  java
  • SmallDateTime时间范围检查

    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 日).

  • 相关阅读:
    Msql-51CTO笔记
    Elasticsearch 学习第一天
    大数据开发参考资料
    1.docker的安装
    java_根据实体字段中的中文汉字排序
    遍历set集合,进行数据的拼接
    关于integer 和int
    03.linux环境安装mysql8的安装包
    02.linux下面安装jdk8
    01.VMware15.5下安装Centos7
  • 原文地址:https://www.cnblogs.com/cuiweifu/p/3786462.html
Copyright © 2011-2022 走看看