DateTime.MaxValue 在 mysql 中保存为零
Posted
技术标签:
【中文标题】DateTime.MaxValue 在 mysql 中保存为零【英文标题】:DateTime.MaxValue saves as Zero in mysql 【发布时间】:2019-03-23 02:20:04 【问题描述】:我正在使用 C# 和 mysql。我有一个要求,我需要将 DateTime.MaxValue 保存到其中一列。
ADO.NET 代码为我提供了 DateTime.MaxValue 的以下值
12/31/9999 晚上 11:59:59
当我将它保存在 mysql 中时,我看到该 datetime(3) 列的值保存为:
0000-00-00 00:00:00.000
ADO.NET 代码示例
DateTime time = DateTime.MaxValue;
sqlCommand.Parameters.AddWithValue("Expires", time);
sqlCommand.ExecuteNonQuery();
该列的数据类型为 datetime(3)
我仍然无法弄清楚为什么 DateTime.MaxValue 被保存为 0000-00-00 00:00:00.000
对此有什么想法吗?
【问题讨论】:
您可能已经超过了 MySql 的最大日期时间值。您可以尝试将值直接保存在 SQL 中,看看会发生什么? “零”值仅在日期值无效或超出范围时插入,datetime
数据类型默认支持DateTime.MaxValue
。您是否尝试过为该参数显式设置MySqlDbType.DateTime
?
@TetsuyaYamamoto 我试图将 dbtype 设置为 DateTime,但没有抛出任何异常并将数据保存为 0000-00-00 00:00:00.000
【参考方案1】:
DATETIME
列可以存储值 up to '9999-12-31 23:59:59'
。 DateTime.MaxValue
实际上是 9999-12-31 23:59:59.9999999
。当您尝试插入它时,小数秒会溢出字段的最大大小。
通常(在STRICT
模式下),MySQL 服务器会发出datetime field overflow
错误。但是如果你在ANSI
模式下运行你的服务器,溢出会被默默地转换为“无效”的日期时间值0000-00-00
。
解决此问题的一种方法是在您的 MySQL 服务器中使用 STRICT
模式。
另一种方法是将列类型指定为DATETIME(6)
,这允许存储小数秒。
第三种方法是在将 C# 中的 DateTime
对象插入数据库之前截断小数秒。
【讨论】:
【参考方案2】:也许某些触发器会阻止将如此重要的日期保存到您的专栏中? 您是否尝试过从 SQL 查询中插入该日期? 我在 Oracle DB 中做了一些测试,一切都很顺利。 在 mysql 中应该不一样...
【讨论】:
Oracle 和 MySQL 日期时间都支持DateTime.MaxValue
。我在一些 SQL IDE 中尝试过,并且插入的值很顺利。以上是关于DateTime.MaxValue 在 mysql 中保存为零的主要内容,如果未能解决你的问题,请参考以下文章
DataContractJsonSerializer序列化时间类型时转换为UTC溢出问题