2013-06-12 90 views
4

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

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

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

为什么会发生这样的吗?

数据Mfdate的类型是datetime

+4

Mfdate的值被传入,这与NULL不一样 – StingyJack

+0

该表是否有触发器? – RBarryYoung

+2

另外,它是“ 1990“或”1900“? – StingyJack

回答

10

你还没有把它作为null,你试图插入一个空字符串('')。您需要:

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

虽然说真的,如果你将要插入日期,最好将其插入到年月日的格式,如:

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

为什么你说“最好”?我认为其中一种ISO格式会更好,因为它们不会受到文化差异的困扰。 – StingyJack

+0

@SingyJack - 根据[ISO 8601](http://en.wikipedia.org/wiki/ISO_8601),YYYY-MM-DD是我所建议的可接受的日期格式。但是,亚伦伯特兰可以随时出现,说我错了。 – LittleBobbyTables

+3

是的,Aaron坚持认为应该使用'YYYYMMDD',因为有很少(甚至是YYYY-MM-DD)SQL-Server都会失败的设置:** [踢坏的习惯:错误处理日期/范围查询](HTTP:// sqlblog。com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx)** –

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) 

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

然而,A null被转换为…好… null,因为SQL标准的要求,任何表达或测试涉及null(使用is [not] null本身必须评估到null除外婚姻无效的明确的测试。

OTOH,如果你有SQL Server的选项设置来治疗null和零字符串几乎可以互换使用,你可能会很早就结束了这个纪元日期