考虑使用:
各种持久列的一些示例(非常感谢 Aaron Bertrand):
- 一年(某日)持续
- M 月(某日)持续
- 持续一个月(某天)
- YMD AS YEAR(SOMEDATE) * 10000 + MONTH(SOMEDATE) * 100 + DAY(SOMEDATE) 持续
- SOMEDATEDIFF 作为 DATEDIFF(DAY, 0, SOMEDATE) 持续存在
- SOMEDATESMALL AS DATEADD(DAY, 0, DATEDIFF(DAY, 0, SOMEDATE)) 持久化
- SOMEDATESMALL AS CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, SOMEDATE, 105)), 105) 持续
- SOMEDATESMALL AS CONVERT(DATE, SOMEDATE) PERSISTED -- 需要 SQL Server 2008
注意这些示例经过精心挑选,以确保功能确定性。
这是一个示例 SQL:
CREATE TABLE DATA
(
ID INT NOT NULL IDENTITY,
FK_FIELD INT NOT NULL,
SOMEDATE DATETIME NOT NULL,
SOMEDATESMALL AS DATEADD(DAY, 0, DATEDIFF(DAY, 0, SOMEDATE)) PERSISTED,
CONSTRAINT PK_DATA PRIMARY KEY (ID),
CONSTRAINT UQ_DATA_SOMEDATESMALL UNIQUE (FK_FIELD, SOMEDATESMALL)
);
如果您尝试了 INSERT,这就是您得到的结果:
INSERT INTO DATA (FK_FIELD, SOMEDATE) VALUES (1, '2012-02-22 4:50PM'); -- SUCCESS
INSERT INTO DATA (FK_FIELD, SOMEDATE) VALUES (2, '2012-02-23 12:00PM'); -- SUCCESS
INSERT INTO DATA (FK_FIELD, SOMEDATE) VALUES (2, '2012-02-23 9:00PM'); -- CAUGHT
INSERT INTO DATA (FK_FIELD, SOMEDATE) VALUES (1, '2012-02-23 8:00AM'); -- SUCCESS
SQL Server Management Studio 中显示的消息是:
消息 2627,第 14 层,状态 1,第 3 行
违反 UNIQUE KEY 约束“UQ_DATA_SOMEDATESMALL”。
无法在对象“dbo.DATA”中插入重复键。
声明已终止。