2016-07-25 82 views
0

我有一个表作为测试差是给不正确的结果

shiftend   |  out   |  
--------------------------------------------- 
15:00:00.0000000 | 2016-07-22 14:42:00 | 
16:00:00.0000000 | 2016-07-22 16:06:00 |  

Shiftend是有一个数据类型为时间 出来是有一个数据类型为SMALLDATETIME

我期待输出作为

shiftend   |   out   | Output  
----------------------------------------------------------------------------- 
15:00:00.0000000 | 2016-07-22 14:42:00 | -00:18:00 
16:00:00.0000000 | 2016-07-22 16:06:00 | 00:06:00 

我想这个查询:

select shiftend,out,CAST((out-Shiftend) as time(0)) as Output from test 
where 
CAST(CONVERT(NVARCHAR(10), out, 101) AS SMALLDATETIME) = CAST(CONVERT(NVARCHAR(10),'2016-07-22', 101) AS SMALLDATETIME) 

但我得到的输出作为

shiftend   | out     |  Output  
----------------------------------------------------------------------------- 
15:00:00.0000000 | 2016-07-22 14:42:00 | 23:42:00 
16:00:00.0000000 | 2016-07-22 16:06:00 | 00:06:00 

23点42分00秒不正确。如何计算时间。

+0

不幸的是,你不能在'time'数据类型负值。它正在将-18变成(00:00 - 00:18),即前一天的23:42。您可以: - 使用'datediff'并将差值保存为秒数,例如。 - 只保存模块化差异,并有一个单独的列来决定它是正面还是负面的差异。 - 编写自己的SQL函数来计算 – Ash

+0

如果它没有给我负面的信息,我们只能得到00:18,那就会好的 –

回答

1

尝试以下查询:

select 
case when (cast(out as time) < shiftend) then '-' else '' end + 
convert(varchar(8), 
    dateadd(minute, 
    abs(
    DATEDIFF(minute, 
    cast(out as time) 
    , shiftend) 
    ) 
,0) 
,108) as Output 

说明:

  • 你得到两个日期之间的差异与DATEDIFF(minute, cast(out as time), shiftend)

  • 您只需要time组件即可避免前一天,因此您使用cast(out as time)shiftend你提到已经是数据类型time

  • abs返回绝对值,所以-18变得18.

  • 然后通过使用将上述值作为分钟00:00:00产生一日期dateadd(minute, [above value], 0)

  • 最后的是因为你需要输出的时间。

  • iif(cast(out as time) < shiftend,'-','')增加了否定符号或不符合单词的开头。

不幸的是,在time数据类型中不能有负值。它将-18转变成00:00 - 18这是23:42。您可以:

  • 使用datediff并将差值另存为例如秒数。
  • 只保存模块化差异,并有一个单独的列来决定它是正面还是负面的差异。
  • 编写自己的SQL函数计算这是一个varchar如上
+0

你的查询给出错误'不正确的语法接近'<'。 –

+0

你可以运行这个查询:'从测试中选择iif(cast(out as time) Ash

+0

不,还是一样的 –