【问题标题】:How to convert negative time span to positive in SQL server 2008如何在 SQL Server 2008 中将负时间跨度转换为正时间跨度
【发布时间】:2015-10-01 08:06:32
【问题描述】:

我有一种情况,其中一些持续时间是负格式并在 SQL 数据库中作为字符串存储为

-06:34:41

其中一些将是积极的格式

02:00:00

01:00:00

现在我需要使用 SQL Server 2008 在选择查询中添加/求和这些持续时间,这样结果将是

-03:34:41

然后在计算后我需要将其恢复为字符串格式。提前致谢。

【问题讨论】:

  • 将字符串转换为TIME数据类型并乘以-1
  • @Raj 你能帮我创建一个示例查询吗?我这样做了,但给我错误“操作数类型冲突:时间与 int 不兼容”
  • 这是什么时间格式? hh:mm:ss?
  • @CeOnSql,是的 hh:mm:ss
  • @Raj - 这不合适。 time 数据类型表示一天中的时间,而不是时间跨度。因此,它不允许负值,也不允许大于 24 小时的值,也不支持加法或减法,因为这些东西对于一天中的某个时间都没有意义

标签: sql-server sql-server-2008 timestamp timespan


【解决方案1】:

这对我有用:

declare @timevalues table
(
    timestring NVARCHAR(10)
)

insert into @timevalues
values
 ('-06:34:41'),
 ('02:00:00'),
 ('01:00:00')
;

with cte
as
( select    case when left(timestring,1)='-' then -1 else 1 end as multiply,
            right(timestring,8) as timestring,
            --get hours in seconds:
            DATEPART(HOUR,right(timestring,8)) * 3600 AS h_in_s,
            --get minutes in seconds:
            DATEPART(MINUTE,right(timestring,8)) * 60 AS m_in_s,
            --get seconds:
            DATEPART(SECOND,right(timestring,8)) AS s
  from      @timevalues 
)

select  case when sum((c.h_in_s + c.m_in_s + c.s) * multiply) < 0
            then '-' + CONVERT(varchar,DATEADD(s,ABS(sum((c.h_in_s + c.m_in_s + c.s) * multiply)),0),114)
            else CONVERT(varchar,DATEADD(s,sum((c.h_in_s + c.m_in_s + c.s) * multiply),0),114)
        end as new_time_string
from    cte c

输出是:

这基本上是做什么的:在 cte 中,我将所有时间分量都设为秒,所以我们可以总结秒数 (h_in_s + m_in_s + s)。获得秒数总和后,您需要将秒数转换为时间字符串。这是通过在我们的表达式中添加 0 秒来完成的(例如 DATEADD(s,15300,0))。将其转换为格式代码为 114 的 varchar,然后瞧

【讨论】:

  • 你太棒了。它适用于我提到的修复值。因此,如果我想从 SQL 表中获取这些值,例如 tblAttend 和列名 ExtraHrs,那么如何编辑此脚本。
猜你喜欢
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多