使用Transact SQL有一种方法可以在列上指定默认日期时间(在create table语句中),以便datetime是datetime值的最小可能值吗?
create table atable ( atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED, Modified datetime DEFAULT XXXXX?????? )
也许我应该把它留空.
据我所知,没有任何函数可以返回它,你将不得不努力设置它.
尝试从0等值转换到最小日期将默认为01-01-1900.
正如之前建议的那样,最好留下设置为NULL(如果需要,可以在阅读时使用ISNULL),或者如果您担心设置正确,甚至可以在表格上设置触发器以设置编辑时的修改日期.
如果您已经准备好了最短的日期,那么:
create table atable ( atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED, Modified datetime DEFAULT '1753-01-01' )
我同意"不要使用魔法价值"的观点.但我想指出,有时候采用这种解决方案是合法的.
设置列可以为nullable付出代价:NULL不可索引.像"获取自2010年初以来未被修改的所有记录"之类的查询包括那些从未被修改过的记录.如果我们使用可空列,那么我们就不得不使用[modified] <@cutoffDate OR [modified] IS NULL,这反过来会强制数据库引擎执行表扫描,因为空值没有被索引.而这最后可能是一个问题.
在实践中,如果这不会引入实际的,真实的性能损失,那么应该使用NULL.但是很难知道,除非你知道今天的实际数据量是多少,并且将在所谓的可预见的未来.您还需要知道是否会有大部分具有特殊值的记录 - 如果是这样,那么无论如何都没有必要对其进行索引.
简而言之,通过deafult /经验法则,应该为NULL.但是,如果有大量记录,则经常查询数据,并且只有一小部分记录具有NULL /特殊值,根据此信息定位记录可能会有显着的性能提升(当然,提供了一个创建索引!)和恕我直言,这有时可以证明使用"魔法"值.
"也许我应该把它留空"
不要使用魔术数字 - 这是不好的做法 - 如果你没有值,就把它留空
否则,如果您确实需要默认日期 - 请使用发布的其他技术之一来设置默认日期
除非您在一个多世纪以前使用数据库来跟踪历史时间
Modified datetime DEFAULT ((0))
非常安全和完美,并且比"1753-01-01"提供更优雅的查询,并且查询效率更高NULL
.
但是,由于第一个Modified datetime
是插入记录的时间,因此您可以使用:
Modified datetime NOT NULL DEFAULT (GETUTCDATE())
这避免了整个问题,使您的插入更容易和更安全 - 因为你根本不插入它,SQL做家务:-)
有了它,你仍然可以通过使用0作为实际的最小值来获得优雅和快速的查询,因为它总是保证低于任何插入生成GETUTCDATE()
.