2015-09-28 71 views
0

我们必须在SQL Server表6列SLA 我试图从下面的添加compained列QASLA 创建 - 实心柱有日期时间 - 非NULLNULL日期计算的SQL Server

EsculationDate - [EsculationFeedback] [InternalEsculationReplay ] - [InternalEsculationDate]列是 时间类型,当我尝试插入一个新的记录可能为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值作为创建日期= 6月10日和结束日期= 6月15日分钟(EsculationDate + EsculationFeedback) 我尝试使用ISNULL也

回答

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)))) 
0

你的一些DATEDIFF声明似乎有“错误的方式围绕”日期。你应该有更早的日期作为第二个参数,后面的日期作为第三个参数来返回他们之间的积极日子。

另外,在许多情况下,您将NULL日期视为0,其中0将被解释为“非常早期的日期”。

我会期待你的处理NULL在这里工作非常不同?您不能使用列和NULL之间的相等比较,您需要改为使用IS NULL语句,例如“Closed = NULL”变成“Closed IS NULL”。

最后,你说封闭日期不是NULL,但你在脚本中做的第一件事是将它与NULL进行比较。