2013-06-12 129 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和零字符串幾乎可以互換使用,你可能會很早就結束了這個紀元日期