我有一个包含两列的表格,如下所示:
[logTime] [datetime] NOT NULL,
[wDate] AS (CONVERT([date],isnull([logtime],'2012-01-01'),0)) PERSISTED,
我正在尝试更改计算出的 wDate 列公式以保存 logtime 的日期部分并能够将其用作索引。该列应保留。
如果我使用:
ISNULL(Convert(date,logtime,0),Convert(date,'2012-01-01',0))
我收到该列无法持久化的错误,因为该列是不确定的。
如果我使用
CONVERT([date],isnull([logtime],'2012-01-01'),0)
我无法清除 Allow Nulls 复选框以在主索引中使用它。
对此有何建议?
最佳答案
这有效(我没有你完整的表定义,所以我做了一个):
create table T (
[logTime] [datetime] NOT NULL,
ID int not null,
[wDate] AS ISNULL(DATEADD(day,DATEDIFF(day,0,[logtime]),0),
CONVERT(date,'20120101',112)) PERSISTED,
constraint PK_T PRIMARY KEY (ID,wDate)
)
就像这样 - 我做了很多摆弄以试图让它工作:
[wDate] AS ISNULL(CONVERT(date,[logtime],112),
CONVERT(date,'20120101',112)) PERSISTED
第二个将
wDate
作为 date
而不是 datetime
,这可能是您想要实现的目标的一部分。但是,第一个永远不会产生非午夜时间,因此总体而言它们具有可比性。最后,Doh!:
[wDate] AS CONVERT(date,[logtime],112) PERSISTED,
也有效。
关于sql-server - 在 SQL Server 中创建一个计算持久列作为主键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18983368/