如何在SQL Server 2005中将datetime的默认值或绑定设置为1/1/0001 12:00:00 AM?

时间:2010-06-20 18:29:51

标签: sql sql-server-2005

我试图将默认值设置为“1/1/0001 12:00:00 AM”,但首先它不允许我。

所以我接着试着把“1/1/0001”但是当我测试它时。它变为(((1)/(1))/(1)),当我尝试默认值时,它返回“01/02/1900 12:00:00 AM”我不知道为什么。< / p>

3 个答案:

答案 0 :(得分:2)

SQL Server中datetime的范围是1753年1月1日到9999年12月31日。如果要将1/1/0001作为值,则必须在SQL Server 2008中使用datetime2

答案 1 :(得分:2)

试试这个

CREATE TABLE MyTable (Id INT, aDate DATETIME NOT NULL DEFAULT('1753-01-01'))

或者,如果你想获得“幻想”,你可以试试这个:

CREATE DEFAULT [dbo].[DefaultDate] AS '1753-01-01'
GO

CREATE TYPE [dbo].[MyDate] FROM [datetime] NOT NULL
GO

EXEC sys.sp_bindefault 
  @defname=N'[dbo].[DefaultDate]', 
  @objname=N'[dbo].[MyDate]' 
GO

CREATE TABLE MyTable (Id INT, aDate [MyDate] NOT NULL)
GO

INSERT INTO MyTable (ID) SELECT 1
SELECT * FROM MyTable 

<强> [编辑]   就像Martin Smith非常注意到的那样,sp_bindefault将在未来的版本中被删除(see this)。因此,使用第一个解决方案可以减少未来升级带来的麻烦。

答案 2 :(得分:1)

首先,DateTime数据类型只能存储最小日期“1753-01-01”。对于SmallDateTime,最短日期为“1900-01-01”。他们选择这个价值并不是偶然的。日历本身在1752年发生了变化,因此尝试比较从'1701-01-01'到现在的天数使用标准日期数学是有问题的。

但是,在SQL Server 2008中,有一个新的DateTime2Date,其中任何一个都可以存储0001-01-01的值,但由于我之所以这样做是错误的提及。

第三,尝试使用任意日期来表示缺少日期值是IMO的错误。这就是我所说的避免空值的“神奇价值”方法。 IMO,它使调用代码变得非常复杂,因为调用代码现在必须知道并检查魔术值而不是null来知道是否显示空白。相反,您应该从LINQ代码返回可为空的DateTime值(DateTime?),并将该null一直传递到表示层,以便表示代码可以处理缺少的值。或