SQL Server插入日期为1/1/1900

时间:2013-06-12 16:40:24

标签: sql sql-server-2005

我正在使用ASP Classic页面在表格中插入记录。 我正在使用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中运行时,它会为1/1/1900插入日期Mfdate,但用户未选择任何值。

为什么会这样?

Mfdate的数据类型为datetime

2 个答案:

答案 0 :(得分:12)

你没有把它作为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) 

答案 1 :(得分:6)

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

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

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

将产生datetime的划时1 January 1900 00:00:00.000值。

然而,null被转换为...... well ... null,因为SQL标准要求任何涉及null的表达式或测试(除了使用{的显式无效测试之外{1}}必须自己评估为is [not] null

OTOH,如果你有SQL Server的选项设置为可以互换地处理null和nil字符串,你可能会结束纪元日期。