差是给不正确的结果
问题描述:
我有一个表作为测试差是给不正确的结果
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秒不正确。如何计算时间。
答
尝试以下查询:
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
如上
不幸的是,你不能在'time'数据类型负值。它正在将-18变成(00:00 - 00:18),即前一天的23:42。您可以: - 使用'datediff'并将差值保存为秒数,例如。 - 只保存模块化差异,并有一个单独的列来决定它是正面还是负面的差异。 - 编写自己的SQL函数来计算 – Ash
如果它没有给我负面的信息,我们只能得到00:18,那就会好的 –