【问题标题】:Subtract hours in SQL在 SQL 中减去小时数
【发布时间】:2017-11-30 03:54:22
【问题描述】:

我在 DB 有几个小时(06:42,9:30,..)。我想从 08:00 减去小时数

我尝试了以下查询

Select totalhrsinside as hour,convert(varchar, dateadd(minute, -8, totalhrsinside), 100) as diff from table_name

但它并没有按预期工作

输出应该是

hour    diff
06:42   -01:18 
09:30   01:30 

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

我认为您正在寻找时间上的差异,而不是减去或添加。

SELECT  Hours
,       CONCAT(
                    CASE WHEN SIGN(diff) = -1 THEN '-' END
                  , FORMAT(ABS(diff/60), '0#')
                  , ':'
                  , FORMAT(ABS(diff%60), '0#')
              ) diff
FROM    (
            SELECT  '6:42' Hours, DATEDIFF(MINUTE, '8:00', '6:42') diff UNION ALL
            SELECT  '9:30' Hours, DATEDIFF(MINUTE, '8:00', '9:30') diff 
        ) D

结果:

+-------+-------+
| Hours | diff  |
+-------+-------+
| 6:42  | -01:18 |
| 9:30  | 01:30  |
+-------+-------+

【讨论】:

  • SELECT CONCAT (FORMAT(diff / 60, '0#'), ':', FORMAT(ABS(diff % 60), '0#')) 将根据 OP 的预期结果返回零填充 -01:18, 01:30
  • 这个方案有个小bug,diff小于1小时时不会显示负号。也许在选择 CONCAT(CASE WHEN SIGN(diff) = -1 THEN '-' END, ABS(diff/60), ':', ABS(diff%60)) 中使用类似的东西
【解决方案2】:

如果时间较短,则使用大小写添加减号。

select 
totalhrsinside as [hour],  
concat(
  case when DateDiff(minute, '08:00', totalhrsinside) < 0 then '-' end, 
  left(dateadd(minute, abs(datediff(minute, '08:00', totalhrsinside)), cast('00:00' as time)), 5)
) as diff
from 
(
 select totalhrsinside 
 from (values 
 ('06:45'),
 ('08:00'),
 ('09:30')
 ) v(totalhrsinside)
) testvalues;

返回:

06:45   -01:15
08:00   00:00
09:30   01:30

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 2015-05-13
    • 1970-01-01
    • 2015-12-29
    • 2016-11-17
    • 1970-01-01
    • 2012-08-03
    • 2015-09-02
    • 2020-07-16
    相关资源
    最近更新 更多