Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 Cast在一个领域工作,但在另一个领域不工作_Sql Server 2008_Casting - Fatal编程技术网

Sql server 2008 Cast在一个领域工作,但在另一个领域不工作

Sql server 2008 Cast在一个领域工作,但在另一个领域不工作,sql-server-2008,casting,Sql Server 2008,Casting,我的表中有两个字段,Cycle和Idle,都是nvarchar(50),都包含时间。我正在尝试使用TSQL根据特定的程序编号获取每个字段的总数。下面是数据的一个小例子 Id ProgramNo Cycle Idle 209702 3998_BOTH_OPPS.MPF 00:02:41 00:00:25 209703 472_7580_OPP1.MPF 00:02:08 00:01:44 209704 3998_BOTH_OPPS.

我的表中有两个字段,Cycle和Idle,都是nvarchar(50),都包含时间。我正在尝试使用TSQL根据特定的程序编号获取每个字段的总数。下面是数据的一个小例子

Id      ProgramNo           Cycle       Idle
209702  3998_BOTH_OPPS.MPF  00:02:41    00:00:25
209703  472_7580_OPP1.MPF   00:02:08    00:01:44
209704  3998_BOTH_OPPS.MPF  00:00:27    00:00:11
209705  3998_BOTH_OPPS.MPF  00:00:00    00:00:00
209706  3998_BOTH_OPPS.MPF  00:00:01    00:01:40
209707  9491_OPP1.MPF       00:00:00    00:00:00
209708  9491_OPP1.MPF       00:00:01    00:00:04
209709  9491_OPP1.MPF       00:01:05    00:00:19
例如,获取程序编号3998\u的总循环时间和空闲时间,包括\u OPPS.MPF和9491\u OPP1.MPF

这是我的疑问

SELECT
  ProgramNo,
  cast(dateadd(MILLISECOND, sum(datediff(MILLISECOND, 0, cast(Cycle AS DATETIME))), 0) AS TIME) AS CycleTime,
  cast(dateadd(MILLISECOND, sum(datediff(MILLISECOND, 0, cast(Idle AS DATETIME))), 0) AS TIME)  AS IdleTime
FROM Cycle
GROUP BY ProgramNo
它在CycleTime中工作正常,但在IdleTime中出现错误:

“从字符串转换日期和/或时间时,转换失败。”


有什么建议吗?先谢谢你

您需要找到与HH:MM:SS格式不匹配的值

这里有一个简单的方法:

select idle_time
from cycle
where idle_time not like '[0-9][0-9]:[0-9][0-9]:[0-9][0-9]'
如果这不起作用,请查看组件:

where (idle_time like '[0-9][0-9]:[0-9][0-9]:[0-9][0-9]' and
       (not (left(idle_time, 2) between '00' and '23') or
        not substring(idle_time, 4, 2) between '00' and '59') or
        not right(idle_time, 2) between '00' and '59')
       )

SQL Server 2012+通过使用
try\u convert()

可以更轻松地完成此操作。根据上面的评论,您可以如下方式修复数据:

cast(dateadd(MILLISECOND, sum(datediff(MILLISECOND, 0, cast(right(Idle,8) AS DATETIME))), 0) AS TIME) as IdleTime
我们只看最右边的8个字符。。。所以如果没有#。在你的时间到来之前,它仍然有效

select right('3.18:15:05',8)
select right('18:15:05',8)

这意味着该字段的记录中有一些错误数据。无法转换的东西。2.03:02:07 3.18:15:05 3.21:06:53 3.19:40:03 2.09:20:53所以我似乎在小时之前有一个数字,后面有一个句点。在我还没来得及看之前,我不小心添加了上面的评论。对于如何合计这些字段,是否有更好的建议?我觉得我什么都试过了。@volleygirl029。请使用适当的示例数据(包括带空格的字段)和所需结果提出另一个问题。