日期时间空值

Posted

技术标签:

【中文标题】日期时间空值【英文标题】:DateTime null values 【发布时间】:2017-03-22 15:41:15 【问题描述】:

我有以下代码应该检查数据读取器中的值是否不为空。如果是,则该方法应返回空值或空 DateTime 以供以后使用。

private static DateTime safeGetDateTime(OleDbDataReader dr, int idx)
    
        if (!dr.IsDBNull(idx))
            return dr.GetDateTime(idx);

        else return DateTime.MinValue; 
    

我尝试只返回 null,但由于方法返回类型是“DateTime”,所以这不起作用。然后,如果数据读取器拾取空值,我尝试返回 DateTime.MinValue。这给了我以下错误:

SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。

感谢任何帮助。

【问题讨论】:

使用可以为空的DateTime? 如果您注意到错误来自SqlDateTime 而不是DateTime,我想您会发现它在return dr.GetDateTime(idx); 行而不是return DateTime.MinValue; 行上引发了异常。 @MichaelL。这似乎不太可能,因为数据库中的值已经是有效的 SQL 日期。我怀疑OP误解了错误的位置,实际上是在将值写入数据库时​​,而不是在从数据库中读取时。 您确定这是错误的位置吗?将值写入数据库时​​可能会发生该错误(尽管在您更改代码之前,您之前的 null 转换错误会在这里发生)。 @JeffreyLWhitledge 好点,你是对的。 【参考方案1】:

由于 CLR 和 SQL 服务器中的 DateTime.MinValue 不同,您会收到此错误。

我建议你使用Nullable Type

【讨论】:

【参考方案2】:

让方法返回一个Nullable<DateTime>,那么就可以返回null

private static DateTime? safeGetDateTime(OleDbDataReader dr, int idx)

    if (!dr.IsDBNull(idx))
        return dr.GetDateTime(idx);
    else 
        return null; 

您仍然需要检查返回值,您的错误表明您在另一个 sql 查询中使用此值作为参数,您必须在 null-case 中分配 DBNull.Value

DateTime? date = safeGetDateTime(reader, columnOrdinal);
yourSqlParameter.Value = date.HasValue ? (object)date.Value : DBNull.Value;

【讨论】:

【参考方案3】:

错误一定来自您将DateTime.MinValue 分配给SqlDateTime 参数。

DateTime.MinValue:

此常量的值相当于 0001 年 1 月 1 日 00:00:00.0000000。

SqlDateTime.MinValue

SqlDateTime 结构的最小有效日期是 1753 年 1 月 1 日。

所以如果你打算在SqlDateTime参数中使用这个方法的返回,你可以尝试返回SqlDateTime.MinValue:

return (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;

或者,你可以尝试使用DateTime?作为返回类型,这样你就可以返回null

【讨论】:

【参考方案4】:

你可以保持safeGetDateTime原样,但是当你将值写回数据库时,你应该检查它是否是DateTime.MinValue。如果是,那么您应该将空值写入数据库。

if (value == DateTime.MinValue)

    comm.Parameters.AddWithvalue("@mydate", null);

else 

    comm.Parameters.AddWithValue("@mydate", value);

【讨论】:

以上是关于日期时间空值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用空值将字符串转换为日期时间 - python,pandas?

日期时间格式空值返回 PHP 中的默认时间

ssis 空日期作为空值

使用空值对 pandas 日期时间进行分组

允许 HTML5 日期输入中的空值 [重复]

计算日期之间的空值