然而:
从 SQL Server 2008 开始的日期字段类型
给定一张桌子:
CREATE TABLE dbo.MyTable
(
Code int NOT NULL,
DateCode datetime NOT NULL
)
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED
(
[Code] ASC, [DateCode] DESC
);
约束 DateCode 只是一个日期的最佳方法是什么?
它必须允许没有时间部分的日期。
2017-01-02
2017-01-02 00:00:00.000
20170102
现在我正在使用:
ALTER TABLE dbo.MyTable ADD CONSTRAINT [CHK_MyTable_DateCode]
CHECK ([DateCode] = DATEADD(DAY, 0, DATEDIFF(DAY, 0, [DateCode])));
但是,我想知道是否有最好/最短的方法来完成它。
您可以稍微简化一下,因为 SQL Server 知道
datetime
它可以将该值视为自 0 以来的天数。我更喜欢使用'19000101'
超过零的值,因为发生的事情稍微不那么神秘:但是,我发现责骂可能使用内置函数之类的用户或他们没有意识到包含时间组件之类的
GETDATE()
参数的用户是一个奇怪的选择。@OrderDate
因此,解决此问题的一种更简洁的方法是使用触发器:这里的一些人不喜欢使用
INSTEAD OF
触发器,但我认为在插入之前按摩这些值比在插入之后更好。PK 的处理方式与没有触发器的情况相同 - 仍然会在插入时捕获违规(但是,使用后触发器,您不会在触发器代码运行之前遇到违规,理论上这至少意味着更多的日志记录)。实际上,您可以GROUP BY
在触发器中添加一个以静默忽略源语句中的重复项,例如INSERT ... VALUES(1,GETDATE()), (1,CURRENT_TIMESTAMP);
.