我正在使用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
。
答案 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字符串,你可能会结束纪元日期。