默认的日期时间值应该是什么?

3

我正在在DataTable中插入Excel表格记录,然后将此DataTable传递给一个SQL存储过程。在我的c#代码中,我对Excel表格的空数据单元格进行了某些检查以避免异常。但是似乎在为我的SQL日期字段提供默认值时漏掉了一些东西。

string InvoiceDate = (row.Cells[3].Text == " ") ? "0/00/0000 00:00:00 AM" : (row.Cells[3].Text);

我收到以下错误:
字符串无法识别为有效的DateTime。无法将<0/00/0000 00:00:00 AM>存储在InvoiceDate列中。预期类型为DateTime。 编辑 - SQL字段[InvoiceDate]声明。
[InvoiceDate] [date] NOT NULL

请不要建议插入 null,因为我无法插入此列的 null


可能是SQL-将NULL插入DateTime的重复问题。 - Tanner
如果你的数据库列是datetime,为什么要传递字符串? - Giorgi Nakeuri
尝试使用 DateTime.Min - 我认为这是 1900 年 1 月 1 日。 - amcdermott
@GiorgiNakeuri 当我使用包含日期列5/31/2015的Excel表格调试我的代码时,我在我的InvoiceDate变量中得到了5/31/2015 12:00:00 AM - Nuke
2个回答

4
首先,在现实世界和 SQL Server 中都没有 00/00/0000 这个日期。 其次,为什么需要默认值?直接使用 null 即可。 第三,在字符串中指定日期时,请使用 ISO 8601 格式(yyyy-mm-ddThh:mm:ss)。 第四,正如 Giorgi 在他的评论中指出的那样,为什么要使用字符串来表示日期时间值?在 c# 中使用类型为 DateTime 的变量。请注意,它的最小值与 SQL Server 的 DateTime 数据类型的最小值不同。
如果你的datetime列不可为空,你可以使用1753-01-01(datetime的最小值)或9999-12-31(datetime的最大值)。
最后,你可能想考虑使用datetime2或将日期和时间分开放在不同的列中(当然,使用数据类型datetime)。为什么呢?请阅读这里。

根据表的设计,我无法在我的列中插入NULL值。 - Nuke
我已经在我的答案中包含了这种情况的一部分:如果您的日期时间列不可为空,您可以使用1753-01-01(日期时间的最小值)或9999-12-31(日期时间的最大值) - Zohar Peled

0
尝试插入当前日期:
string InvoiceDate = string.IsNullOrEmpty(row.Cells[3].Text) ? DateTime.Now.ToString() : (row.Cells[3].Text);

请从您的代码中删除 ? "0/00/0000 00:00:00 AM" 部分 ;)。 - shA.t

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