我试图将默认值设置为“1/1/0001 12:00:00 AM”,但首先它不允许我。
所以我接着试着把“1/1/0001”但是当我测试它时。它变为(((1)/(1))/(1)),当我尝试默认值时,它返回“01/02/1900 12:00:00 AM”我不知道为什么。< / p>
答案 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中,有一个新的DateTime2
或Date
,其中任何一个都可以存储0001-01-01
的值,但由于我之所以这样做是错误的提及。
第三,尝试使用任意日期来表示缺少日期值是IMO的错误。这就是我所说的避免空值的“神奇价值”方法。 IMO,它使调用代码变得非常复杂,因为调用代码现在必须知道并检查魔术值而不是null来知道是否显示空白。相反,您应该从LINQ代码返回可为空的DateTime值(DateTime?
),并将该null一直传递到表示层,以便表示代码可以处理缺少的值。或