datetime的默认值

时间:2014-01-29 17:51:32

标签: sql sql-server

如何搜索包含默认值的日期(日期时间),即''。我猜它不是:

select * from table where dateofbirth=''

所有日期似乎都有默认值'1900-01-01'。但是,我的数据库中有人在此日期或之前有出生日期(主要是histroic人)。所以我做不到:

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

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

我想最好在未知日期使用空值。在这种情况下,我无法做到这一点。

我在这里已经阅读了很多关于使用SQL查找日期的问题,但我没有找到我的具体问题的答案。

3 个答案:

答案 0 :(得分:0)

你要获得的最好的就是你所列出的:

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

如你所知,问题是,如果有人真的出生在1900年1月1日,你也会包括它们。但是你的查询真的无法知道差异。

要解决此问题,您需要更改系统使用的默认值(例如,NULL或更改为datetime2或date数据类型并使用1/1/0001)。然后将所有1/1/1900值更新为新的默认值。是的,这将错误地更新任何现有的1/1/1900生日的人,但至少它将防止将来发生。

答案 1 :(得分:0)

在SQL Server术语中,列X的默认值仅在首次创建新记录且未为该列提供值时使用。在初始创建记录之后,值只是一个值,与任何其他值相同。在单个表中,无法区分在列X中保留默认值的记录,因为它是提供的,或者是因为它是默认值。

这对你现在没有帮助,但有时使用的空值替代方法是使用“魔术值”。在出生日期的情况下,9999年12月31日的最大日期时间值可用于表示未知值(假设您的系统预计在8,000年内不会被使用:)有些人(包括我)不在我真的赞同使用魔法值,因为在数据库中没有办法表明他们的魔法状态。

里斯

答案 2 :(得分:0)

您可以将默认的DateTime值设为;

SELECT CONVERT(DATETIME, 0)

并根据需要将其应用于过滤器;

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

或者如果您需要选择更早的日期;

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

<强> Fiddle example