2015-12-14 494 views
0

在表中,我有一列(AvgWaitTime),它以秒为单位存储数据值(数据类型:float),明智的。我有一个函数使用AvgWaitTime列和其他几列执行一些计算,并以时间格式返回一个值。我想将函数返回的值(时间格式)转换为秒(最好是小数,如果不是则为int)。操作数类型冲突:时间与int不兼容

select 
(datepart(HH, dbo.fnGetMonthlyAverageWaitTime(m.RDate) * 60 * 60) + 
datepart(mi, dbo.fnGetMonthlyAverageWaitTime(m.RDate) * 60) + 
datepart(s, dbo.fnGetMonthlyAverageWaitTime(m.RDate)))[MonthlyAverageWaitTime] 
from TelephonyMTD m 

Error: Operand type clash: time is incompatible with int 

所以,我试图运行这个命令:

select 
(datepart(HH, GetDate() * 60 * 60) + 
datepart(mi, GetDate() * 60) + 
datepart(s, GetDate())) 

现在它说,从数据类型的datetime隐式转换为int是不允许的。使用CONVERT函数来运行此查询。当我查看数据类型转换图表时,这是真的,我知道现在允许转换为int和float。

请指教。

+1

'GETDATE()* 60',可能是你意思是...... GetDate())* 60'? –

+0

摆脱函数也可能是一个好主意,将其更改为内联表值函数,或者如果这不起作用,至少每行调用它一次。 –

回答

0

打开和关闭括号是一个问题引起了上述错误:请尝试像下面

SELECT ( 
(Datepart(HH, Getdate()) * 60 * 60) + 
(Datepart(mi, Getdate()) * 60) + 
Datepart(s, Getdate()) 
) 
1

问题是你试图通过一个整数,没有任何意义繁殖日期/日期:

GetDate() * 60 * 60 

你可以简单地使用DATEDIFF用秒,以秒为单位获得的价值:

SELECT DATEDIFF(SECOND, '00:00:00', dbo.fnGetMonthlyAverageWaitTime(m.RDate)) AS MonthlyAverageWaitTime 
FROM TelephonyMTD AS m 

简单的例子

SELECT t.AvgTime, 
     AvgTimeInSeconds = DATEDIFF(SECOND, '00:00:00', t.AvgTime) 
FROM (VALUES 
      (CAST('00:01:15' AS TIME)), 
      (CAST('05:36:47' AS TIME)) 
     ) AS t (AvgTime); 

其中给出:

+----------+------------------+ 
| AvgTime | AvgTimeInSeconds | 
+----------+------------------+ 
| 00:01:15 |  75  | 
| 05:36:47 |  20207  | 
+----------+------------------+ 
0

尝试使用下面的语法来seconds转换为day, hour, minute, seconds

DECLARE @sec INT = 86400; 

SELECT 
    CAST(@sec /60/60/24 AS VARCHAR(12)) + ' Days,' 
    + CAST(@sec /60/60 % 24 AS VARCHAR(12))+ ' Hours,' 
    + CAST(@sec /60 % 60 AS VARCHAR(2)) + ' Minutes, ' 
    + CAST(@sec % 60 AS VARCHAR(2))  + ' Seconds.'; 
相关问题