我们在SQL Server表SLA上有6个列 我试图从下面添加补充列QASLA 创建 - 关闭列是日期时间 - 非空
EsculationDate - [EsculationFeedback] [InternalEsculationReplay] - [InternalEsculationDate]列是 datetime类型和可能是NULL值
alter table SLA
add QASLA as
iif((Closed=null),datediff(dd,getdate(),Created),
(datediff(dd,Closed,Created))-datediff(dd,IIF(COALESCE ([EsculationDate],0)>COALESCE ([InternalEsculationDate],0),COALESCE ([InternalEsculationDate],0),COALESCE ([EsculationDate],0)),
IIF(COALESCE ([EsculationFeedback],0)>COALESCE ([InternalEsculationReplay],0),COALESCE ([EsculationFeedback],0),COALESCE ([InternalEsculationReplay],0))))
当我尝试插入新记录时
insert into [dbo].[SLA]
([Created],[EsculationDate],[EsculationFeedback],[Closed])
values('10-Jun-15','10-Jun-15','15-Jun-15','15-Jun-15')
QASLA结果= -42173 我需要获得值0作为创建日期= 10月6日和结束日期= 15 Jun分钟(EsculationDate + EsculationFeedback) 我也尝试使用ISNULL
答案 0 :(得分:0)
我不太清楚我理解你的问题,但你IIF
在这里没用,因为它永远不会等于NULL。您无法将值与NULL进行比较,必须使用IS NULL
:
alter table SLA
add QASLA as
iif((Closed is null),datediff(dd,getdate(),Created),
(datediff(dd,Closed,Created))-datediff(dd,IIF(COALESCE ([EsculationDate],0)>COALESCE ([InternalEsculationDate],0),COALESCE ([InternalEsculationDate],0),COALESCE ([EsculationDate],0)),
IIF(COALESCE ([EsculationFeedback],0)>COALESCE ([InternalEsculationReplay],0),COALESCE ([EsculationFeedback],0),COALESCE ([InternalEsculationReplay],0))))
答案 1 :(得分:0)
某些DATEDIFF语句的日期似乎是“错误的”。您应该将较早的日期作为第二个参数,将较晚的日期作为第三个参数来返回它们之间的正日。
此外,在许多情况下,您将NULL日期视为0,其中0将被解释为“非常早的日期”。
我原本期望你对NULL的处理在这里的工作方式有很大不同?您不能在列和NULL之间使用相等比较,而是需要使用IS NULL语句,例如“Closed = NULL”变为“Closed IS NULL”。
最后,你说Closed Date不是NULL,但你在脚本中做的第一件事就是将它与NULL进行比较。