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 日的日期时间问题的主要内容,如果未能解决你的问题,请参考以下文章
Java 时间戳 - 如何创建日期为 2007 年 9 月 23 日的时间戳?