【问题标题】:What should be a default datetime value?默认的日期时间值应该是什么?
【发布时间】:2015-08-25 13:58:54
【问题描述】:

我在c# 中的DataTable 中插入 Excel 表记录,并将此 DataTable 传递给 SQL stored procedure。在我的 c# 代码中,我对 Excel 表的 empty 数据单元格进行了某些检查以避免异常。但似乎我在为我的 SQL Date 字段提供 default 值时遗漏了一些东西。

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

我收到以下错误:

字符串未被识别为有效的日期时间。无法存储 发票日期列中的 。预期类型是 日期时间。

已编辑 - SQL字段声明[InvoiceDate]

[InvoiceDate] [date] NOT NULL

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

【问题讨论】:

  • SQL - Insert NULL into DateTime 的可能重复项
  • 如果您的数据库列是日期时间,为什么要传递字符串?
  • 尝试使用DateTime.Min - 我认为这是 1/Jan/1900
  • @GiorgiNakeuri 当我 debug 我的代码在日期列中包含 5/31/2015 的 Excel 表时,我在我的 InvoiceDate 变量中得到 5/31/2015 12:00:00 AM

标签: sql-server datetime type-conversion


【解决方案1】:

首先,没有00/00/0000日期,现实世界中没有,sql server中也没有。

第二,为什么还需要默认值?只需使用 null 代替。

第三,使用 ISO 8601 格式指定字符串中的日期 (yyyy-mm-ddThh:mm:ss)

Forth,正如Giorgi 在他的评论中正确指出的那样,为什么还要使用字符串作为日期时间值?在c# 中使用DateTime 类型的变量。请注意,它的最小值与 sql server DateTime 数据类型的最小值不同。

如果您的datetime 列不可为空,您可以使用1753-01-01(日期时间的最小值)或9999-12-31(日期时间的最大值)

最后一件事,您可能需要考虑使用datetime2 或将日期和时间分隔到不同的列(当然,数据类型为datetime)。为什么? read here.

【讨论】:

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

尝试插入当前日期:

string InvoiceDate = string.IsNullOrEmpty(row.Cells[3].Text) ? DateTime.Now.ToString() : (row.Cells[3].Text);

【讨论】:

  • 请从您的代码中删除? "0/00/0000 00:00:00 AM" 部分;)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2018-09-26
  • 2016-07-03
  • 2011-12-03
  • 2012-12-07
相关资源
最近更新 更多