2014-01-29 104 views
0

如何搜索包含默認值(即'')的日期(日期時間)。我想它不是:datetime的默認值

select * from table where dateofbirth='' 

所有的日期似乎有默認值'1900-01-01'。但是,我的數據庫中有人在此日期或之前有出生日期(主要是histroic人)。因此我做不到:

select * from table where dateofbirth='1900-01-01' 

我知道某些版本的SQL Server的默認日期爲:1899-12-31。

我想最好是用未知日期的空值。在這種情況下,我無法做到這一點。

我已閱讀了很多關於使用SQL查找日期的問題,但是我還沒有找到對具體問題的答案。

+1

' '''不是一個有效的'datetime' –

回答

0

你會得到最好的是你什麼上市:

select * from table where dateofbirth='1900-01-01' 

正如你所知道的,問題是,如果有人真的出生於1/1/1900,你也將囊括其中。但是,您的查詢確實沒有辦法瞭解其差異。

要解決此問題,您需要更改系統使用的默認值(例如NULL或更改爲datetime2或日期數據類型並使用1/1/0001)。然後將所有1/1/1900值更新爲新的默認值。是的,這將錯誤地更新任何現有的人與1/1/1900生日,但至少它會阻止任何未來的事件。

0

在SQL Server術語中,僅當第一次創建新記錄並且未爲該列提供值時才使用列X的缺省值。在最初創建記錄後,該值只是一個值,與其他值相同。在單個表中,沒有辦法區分那些在X列中保存缺省值的記錄,因爲它是提供的,或者是默認值。

這對你現在沒有幫助,但有時使用的空值的替代方法是使用'魔法值'。在出生日期的情況下,9999年12月31日的最大日期時間值可以用來表示未知的值(假設您的系統預計在8000年內不會被使用)。有些人(包括我)因爲在數據庫中沒有辦法指示它們的魔法狀態,所以真的很贊同使用魔法值。

Rhys

0

您可以得到默認的DateTime值爲;

SELECT CONVERT(DATETIME, 0) 

並將其適用於過濾器;

SELECT * FROM [Table] WHERE DateOfBirth = CONVERT(DATETIME, 0) 

或者如果您需要選擇更早的日期,

SELECT * FROM [Table] WHERE DateOfBirth <= CONVERT(DATETIME, 0) 

Fiddle example