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 中保存为零的主要内容,如果未能解决你的问题,请参考以下文章

DateTime 问题 - 对象外部可用但内部不可用的值

DataContractJsonSerializer序列化时间类型时转换为UTC溢出问题

在流分析查询中生成倒置时间戳

winform 中怎么存cookie的值

asp.net 滑动缓存 总是3分钟左右过期为啥?优先级已经是NotRemovable

mac装好了mysql怎么打开