【问题标题】:SQL Server inserting Date as 1/1/1900SQL Server 插入日期为 1/1/1900
【发布时间】:2013-06-08 21:09:49
【问题描述】:

我正在使用 ASP 经典页面在表中插入记录。 我正在为 5 个字段使用表单元素,即。 [ABC] ([code], [updatedate], [flag], [Mfdate]。当用户没有选择 Mdate 时,使用日期控件获取用户在 Mdate 中选择的日期,它在我的 ASP 中形成的查询页面如下

INSERT INTO [ABC] ([code], [updatedate], [flag], [Mfdate]) 
VALUES('203 ', '6/12/2013', 'N/A', '')

当它在 SQL Server 中运行时,它会为 Mfdate 插入日期 1/1/1900,但用户尚未选择任何值。

为什么会这样?

Mfdate 的数据类型是datetime

【问题讨论】:

  • 正在为 Mfdate 传入值 ''。这和 NULL 不一样。
  • 那张桌子上有触发器吗?
  • 还有,是“1990”还是“1900”?
  • @StingyJack SELECT CAST('' as datetime) = 1900-01-01 00:00:00.000
  • @MartinSmith - 是的,但是 OP 说“1990”

标签: sql sql-server-2005


【解决方案1】:

您没有将其设为 null,您正在尝试插入一个空字符串 ('')。你需要:

INSERT INTO [ABC] ([code],[updatedate],[flag],[Mfdate]) 
VALUES ('203', '6/12/2013','N/A', NULL) 

虽然真的,如果您要插入日期,最好以 YYYYMMDD 格式插入它们,如:

INSERT INTO [ABC] ([code],[updatedate],[flag],[Mfdate]) 
VALUES ('203', '20130612','N/A', NULL) 

【讨论】:

  • 为什么说“最好”?我认为其中一种 ISO 格式会更好,因为它们不会被文化差异所混淆。
  • @StingyJack -- 根据ISO 8601,YYYY-MM-DD 是我建议的可接受的日期格式。但是 Aaron Bertrand 随时可能出现说我错了。
  • 是的,Aaron 坚持应该使用 'YYYYMMDD',因为在 SQL-Server 中,即使是 YYYY-MM-DD 也会失败的(罕见)设置:Bad habits to kick : mis-handling date / range queries
  • @Codelearner - 你真的需要用你的代码编辑你的问题,因为我不知道你使用的是 C#、VB.NET、Java、PHP、Perl 还是其他东西。它基本上归结为检查空字符串,并将适当的 NULL 等价物传递给参数。
  • @Codelearner - 我没有看到任何代码。您究竟是如何构建 SQL 字符串的?
【解决方案2】:

SQL Server 日历的纪元或零点是 1900 年 1 月 1 日的一天开始 (00:00:00.000)。

datetime 的内部表示由 2 个 32 位有符号整数组成。高位整数为纪元以来的天数县;低位整数是自一天开始以来的毫秒数。导致datetime 值的表示为零的任何内容,例如:

select convert(datetime,0)
select convert(datetime,'')
select convert(datetime,0x0000000000000000)

将产生 1 January 1900 00:00:00.000 的纪元 datetime 值。

然而,null 被转换为……好吧……null,因为 SQL 标准要求任何涉及 null 的表达式或测试(除了使用 is [not] null 的显式无效测试之外,它本身必须计算为null.

OTOH,如果您将 SQL Server 的选项设置为几乎可以互换地处理 null 和 nil 字符串,那么您很可能会以纪元日期结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2013-03-11
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多