1900 年 1 月 1 日的日期时间问题

Posted

技术标签:

【中文标题】1900 年 1 月 1 日的日期时间问题【英文标题】:datetime issue with 01/01/1900 【发布时间】:2011-04-01 04:12:17 【问题描述】:

我在 sql server 中有一个 datetime 列及其可选字段,如果用户决定不输入,那么我想在表中将值作为 NULL 插入,我定义如下:

@deadlineDate datetime = null

当我插入 sql server 时,我在 asp.net 中有这段代码

private DateTime? GetDeadlineDate()

    DateTime? getDeadlineDate = null;
    if (!string.IsNullOrEmpty(DeadlineDate.SelectedDate))
    
       getDeadlineDate = DateTime.Parse(DeadlineDate.SelectedDate).Date;
    
    if (!getDeadlineDate.HasValue)
    
        return null;
    
    return getDeadlineDate.Value;


但问题是:它的插入

1900-01-01 00:00:00.000

在sql表中而不是NULL

我在这里做错了什么?

更新:

private DateTime? GetDeadlineDate()

    DateTime? getDeadlineDate = null;
    if (!string.IsNullOrEmpty(DeadlineDate.SelectedDate))
    
       getDeadlineDate = DateTime.Parse(DeadlineDate.SelectedDate).Date;
    
    if (!getDeadlineDate.HasValue)
    
        return DBNull.Value; //throws error....
    
    return getDeadlineDate.Value;          

【问题讨论】:

Nisar,您的更新不起作用,因为 DBNull.Value 的类型为 DBNull,而不是 DateTime?。我想你已经把自己弄糊涂了。 请记住,在第一个代码块中,方法的最后 5 行等效于 return getDeadlineDate; 【参考方案1】:

插入 SQL Server 时需要DBNull.Value 而不是null

当您在 .NET 中设置 DateTime = null 时,它会采用 DateTime 的最小值,即 01-01-0001。

我假设您在 SQL Server 中使用SMALLDATETIME,其中最小值为 '01/01/1900'

【讨论】:

无法将类型“System.DBNull”隐式转换为“System.DateTime?” 你必须发布代码执行INSERT,这是你应该使用DBNULL.Value的地方 克里斯:我已经发布了代码 GetDeadlineDate() 是从文本框中获取日期的方法。 我在 sql server 中有日期时间,我正在使用 sql server 2008 * 默认值DateTime = default(DateTime) = DateTime.MinValue = 1900-00-00 00:00:00【参考方案2】:

假设你有:

DateTime? date = GetDate();
command.Parameters.Add("@date").Value = date;

如果date == null 你想插入 SQL NULL 即DBNull.Value 那么你应该做下一步:

DateTime? date = GetDate();
command.Parameters.Add("@date").Value = (object)date ?? DBNull.Value;

意思是一样的:

if(date != null)
     // use date
else
     // use DBNull.Value

如果你想在你的函数中处理可以为空的日期时间,你应该用下一个方式声明它:

private object GetDate()

    DateTime date;
    return DateTime.TryParse(selectedDate, out date) ? date : DBNull.Value;


command.Parameters.Add("@date").Value = GetDate();

但我不建议这样做并使用下一个:

command.Parameters.Add("@date").Value = (object)GetDate() ?? DBNull.Value;

【讨论】:

无法确定条件表达式的类型,因为'System.DateTime'和'System.DBNull'之间没有隐式转换在GetDate()方法中得到这个错误。 你需要明确设置参数的DbType,然后。 @Steven:我使用了虚拟参数声明 - 仅作为示例。当然在实际应用中应该明确指出类型【参考方案3】:

如果您将查询作为参数(字符串类型)发送到另一个执行查询的方法,如下所示:

        int userno = 123;
        string date_variable = null;

        string query = string.Format(
                    @"INSERT INTO system_log (userno,ref_date) values (0,'1');",userno,date_variable);

        obj.executeInsert(query,conn);

当使用 ExecuteNonQuery() 或其他方法执行时,这可能会再次保存默认日期。

即使传递(对象)date_variable ?? DBNull.值;在这种情况下不起作用

然后你可以简单地将 date_variable 设置为“null”

        if (string.IsNullOrEmpty(date_variable))
            date_variable= "null";
        else
            date_variable= "'" + date_variable+ "'";
        string query = string.Format(
                @"INSERT INTO system_log (userno,ref_date) values (0,1);",123,date_variable);
         obj.executeInsert(query,conn);

【讨论】:

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

2.给出距离1900年1月1日的天数,求日期

为啥excel日期格式会变成数字

将日期转换为数字的公式[关闭]

Java 时间戳 - 如何创建日期为 2007 年 9 月 23 日的时间戳?

sqlserver中datetime类型字段的取值范围是多少?

1339698600000 = 2012 年 6 月 15 日的日期格式是啥?