有条件地替换计算中的变量

时间:2019-05-20 17:28:19

标签: sql-server

我有以下代码,以分钟为单位计算两个时间点-“ CompleteDataTime”和“ RequestedDateTime”之间的时间。

 Select [Financial Number],
 datediff(mi,CompletedDateTime1, RequestedDateTime2) as Prov_to_dispo1
 FROM NewTable
 order by [Financial Number]

在某些记录中,“ CompleteDataTime”变量为空白或丢失;因此,代码在计算Prov_to_dispo1时会为这些记录生成一个“空”值。

我的数据集“出发日期和时间”中还有另一个变量,当缺少“ CompleteDataTime”时,我想将其用作“ CompleteDataTime”的代理-这可能吗?

我假设我需要一个看起来像IF-THEN的语句

IF 'CompleteDataTime' = . THEN Prov_to_dispo1 = datediff(mi,'Depart Date & 
Time', RequestedDateTime2) as Prov_to_dispo1

所需的输出应类似于

 FIN  Prov_to_dispo1
  1        345
  2        685
  3        148
  4        306
  5        265

2 个答案:

答案 0 :(得分:1)

这应该做到。

Select [Financial Number],
case when isnull(CompletedDateTime1, '') = '' then
    datediff(mi,DepartDateTime, RequestedDateTime2) 
else
    datediff(mi,CompletedDateTime1, RequestedDateTime2)
end as Prov_to_dispo1
FROM NewTable
order by [Financial Number]

答案 1 :(得分:1)

您可以使用ISDATE()功能。根据官方文档:

  

如果表达式是有效的日期,时间或日期时间值,则返回1;否则,返回1。否则为0

如果您使用的是SQL Server 2012或更高版本,我建议您使用IIF()函数而不是CASE-WHEN语句。如果您不知道IIF()函数的工作方式,那么IIF()函数的语法如下:

IIF ( boolean_expression, true_value, false_value )  

因此,代码如下:

SELECT
  [Financial Number],
  DATEDIFF(
    mi,
    IIF(
      ISDATE(CompletedDateTime1) = 1, --boolean_expression
      CompletedDateTime1, -- true_value
      'Depart Date & Time' -- false_value
    ),
    RequestedDateTime2
  ) as Prov_to_dispo1
FROM NewTable
ORDER BY [Financial Number]

希望这会有所帮助。谢谢!