DateTime.MaxValue在mysql中保存为零

4
我正在使用C#和MySql。我有一个需求,需要将DateTime.MaxValue保存到其中一个列中。
ADO.NET代码给出了以下DateTime.MaxValue的值:
12/31/9999 11:59:59 PM
当我保存这个值到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 中保存该值,看看会发生什么。 - Chris Gessler
只有在日期值无效或超出范围时才插入“零”值,默认情况下 datetime 数据类型支持 DateTime.MaxValue。您尝试为该参数显式设置 MySqlDbType.DateTime 吗? - Tetsuya Yamamoto
@TetsuyaYamamoto 我尝试将dbtype设置为DateTime,但没有抛出任何异常,并将数据保存为0000-00-00 00:00:00.000。 - nimi
2个回答

4

DATETIME列可以存储值高达'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对象中截断小数秒。


1
也许有一些触发器阻止将如此高的日期保存到您的列中? 您尝试从SQL查询插入该日期了吗? 我在Oracle DB中进行了一些测试,一切顺利。 在mysql中也不应该有什么不同...

Oracle和MySQL datetime都支持DateTime.MaxValue。我在一些SQL IDE中尝试了一下,插入的值很顺利。 - Tetsuya Yamamoto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接