【数据库-MySql】Unable to convert MySQL date/time value to System.DateTime

  问题背景

Mysql 5.5.20

Entityframework 6.2.0

MySql.Data 6.10.7

MySql.Data.Entity 6.10.7

出错代码

其中 create_time为 timestamp 值为 "0000-00-00 00:00:00"


public partial class mytable
{
    public System.DateTime create_time { get; set; }
}

using (MyEntities db = new MyEntities())
{
  var a =  db.mytable.ToList();
}

报错信息 

Unable to convert MySQL date/time value to System.DateTime

解决方案一、通过连接字符串配置,将“0000-00-00 00:00:00”转换为"0001-1-1 00:00:00"

A、如果还未添加模型

最后自动生成的连接字符串如下,较正常的字符串增加:convertzerodatetime=True

metadata=res://*/Models.Model2.csdl|res://*/Models.Model2.ssdl|res://*/Models.Model2.msl;provider=MySql.Data.MySqlClient;provider connection string="server=127.0.0.1;user id=root;persistsecurityinfo=True;database=mydb;convertzerodatetime=True"

B、如果已添加模型

1、在《App.config》或《Web.config》添加 连接字符串配置 Convert Zero Datetime=True

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="MyEntitys" connectionString="metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=127.0.0.1;user id=root;password=root;database=mydb;Convert Zero Datetime=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

分析

C# System.DateTime有最大值"9999-12-31 23:59:59"和最小值"0001-1-1 0:00:00" ,"0000-00-00 00:00:00"小于 System.DateTime的最小值 "0001-1-1 0:00:00",所以导致转换失败。

拓展

环境版本数据类型存储类型下限上限
Mysql 5.5.20timestamp

int

最大值(2147483647)

1970-01-01 08:00:01 2038-01-19 11:14:07
Mysql 5.5.20datetime 0000-00-00 00:00:009999-12-31 23:59:59
C#2013System.DateTime 0001-1-1 0:00:009999-12-31 23:59:59

 

 

 

 

 

mysql< SELECT FROM_UNIXTIME( 0, '%Y-%m-%d %H:%i:%s' ) 
mysql> 1970-01-01 08:00:00


mysql< SELECT FROM_UNIXTIME( 2147483647, '%Y-%m-%d %H:%i:%s' ) 
mysql> 2038-01-19 11:14:07

mysql< SELECT UNIX_TIMESTAMP('1970-01-01 08:00:00');
mysql> 0

mysql< SELECT UNIX_TIMESTAMP('2038-01-19 11:14:07');
mysql> 2147483647

mysql< SELECT DATE_ADD('1970-01-01',INTERVAL (2147483647-2147483647%(60*60*24) )/(60*60*24) DAY) AS Dates,
FLOOR((2147483647-2147483647%(60*60*24) )/(60*60*24)) AS Days,
FLOOR(8+(2147483647%(60*60*24) - 2147483647%(60*60))/(60*60)) AS Hours,
FLOOR((2147483647%(60*60) - 2147483647%60)/60) AS Minutes,
2147483647%60 AS Seconds;

mysql>
Dates       Days    Hours    Minutes Seconds
2038-01-19	24855	11	     14 	 7

mysql< SELECT DATE_ADD('1970-01-01 08:00:00',INTERVAL 2147483647 SECOND);
mysql> 2038-01-19 11:14:07

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值