NULL日期计算SQL Server

时间:2015-09-28 13:27:37

标签: sql sql-server

我们在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

2 个答案:

答案 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进行比较。