从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值

简介: 最近在ASP.NET MVC中遇到一个问题,如题,在使用EF数据模型的时候,要去添加一条新的数据到Sqlserver数据库,在之前项目中并没有出现该异常,所以去扒了扒demo,发现有几个字段(数据库类型为datetime)savechange的时候默认绑定了datetime.now。

最近在ASP.NET MVC中遇到一个问题,如题,在使用EF数据模型的时候,要去添加一条新的数据到Sqlserver数据库,在之前项目中并没有出现该异常,所以去扒了扒demo,发现有几个字段(数据库类型为datetime)savechange的时候默认绑定了datetime.now。问题就在这里,我的新项目并没有给定这几个字段的数据。下面总结下:

触发该错误的条件如下:

  1. SQL Server数据库版本中的字段类型为datetime2
  2. 数据库中,某个要进行Add或者Edit的字段的数据类型为datetime,比如表A中的today字段,类型为datetime。而后台代码进行数据库操作时,并没有给today(datetime类型)赋值。结果就是VS2015编译的时候默认将其类型编译为datetime2,导致用EF进行add和edit操作的时候出现该异常。 

解决方案:

  1. 给这些字段一个值(不管它是否在数据库设置了默认值),并且日期要大于1753年1月1日,这是最简单的方法。
  2. 将数据库类型修改为datetime?类型,也就是说允许为空。
  3. 修改数据库字段类型为datetime2类型,前提是数据库要支持该类型。
  4. 在C#中用new DateTime(year,month,day,hour,minute,second)来限制精度,原因之后会在datetime2和datetime的区别中提到。
  5. 这个方法不太推荐,将model的edmx中的providerManifestToken设置成2005,这样ef就默认转化成datetime。

datetime2和datetime的区别:

官方MSDN对于datetime2的说明:定义结合了 24 小时制时间的日期。 可将 datetime2 视作现有 datetime 类型的扩展,其数据范围更大,默认的小数精度更高,并具有可选的用户定义的精度。

这里值的注意的是datetime2的日期范围是"0001-01-01 到 9999-12-31"(公元元年 1 月 1 日到公元 9999 年 12 月 31 日)。

而datetime的日期范围是:”1753 年 1 月 1 日到 9999 年 12 月 31 日“。这里的日期范围就是造成“从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值”这个错误的原因。

DateTime字段类型对应的时间格式是yyyy-MM-dd HH:mm:ss.fff,3个f,精确到1毫秒(ms),示例2014-12-0317:06:15.433。

DateTime2字段类型对应的时间格式是yyyy-MM-dd HH:mm:ss.fffffff,7个f,精确到0.1微秒(μs),示例2014-12-0317:23:19.2880929。

如果用SQL的日期函数进行赋值,DateTime字段类型要用GETDATE(),DateTime2字段类型要用SYSDATETIME()。

 

 

转自:http://blog.sina.com.cn/s/blog_bc5f90cd0102wufh.html

相关文章
|
2月前
|
网络安全 Python
这个错误是由于在将字符串类型的值转换为字典类型时出现了问题
【2月更文挑战第20天】这个错误是由于在将字符串类型的值转换为字典类型时出现了问题
15 1
|
6月前
|
JavaScript 前端开发 API
`toISOString()` 方法将日期对象转换为字符串
`toISOString()` 方法将日期对象转换为字符串
112 1
|
11月前
|
存储 JavaScript 前端开发
数值的扩展方法以及新增数据类型BigInt
数值的扩展方法以及新增数据类型BigInt
67 0
|
11月前
|
存储 关系型数据库 MySQL
列的类型定义——日期和时间类型
前言 日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型。其中,YEAR类型表示年,DATE类型表示日期,TIME类型表示时间,DATETIME和TIMESTAMP表示日期和时间。下面从这5种日期与时间类型的字节数、取值范围和零值等方面进行对比,如下表所示。
C# 中 double 型数值与 DateTime 的相互转换
C# 中 double 型数值与 DateTime 的相互转换
|
JavaScript API 开发者
你知道toString()可以获取变量的数据类型吗?
js是弱类型语言,或者说是动态语言,在定义变量时我们可以不提前声明变量的类型,也可以在变量声明后赋予不同类型的值。变量的类型会在程序运行的过程中被确定。对于开发者来说,虽然可以不用频繁的定义不同的数据类型,但是如果是比较复杂的项目,或者接手他人的项目,发现一个变量到处被使用并且赋予不同类型的值,也许头都大了。变量类型的不确定还可能出现运行时报错:`xxx is not a function`,根本原因就是不同的数据类型所具有的方法是不一样的,也许有的大家都有,因此不报错;但是如果是特有的,或者有差异的,不判断变量的类型就直接调用,就有可能出现生产bug。那么应该如何才能获取准确的变量类型呢?
182 0
|
Go
DATETIME类型和BIGINT 类型互相转换
原文:DATETIME类型和BIGINT 类型互相转换 项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ======================...
1456 0