操作数类型冲突:时间与int不兼容

时间:2015-12-14 11:29:19

标签: sql-server tsql

在表格中,我有一个列(AvgWaitTime),以秒为单位存储数据值(数据类型:浮点数),日期。我有一个函数,它使用AvgWaitTime列和其他几列执行一些计算,并以时间格式返回一个值。我想将函数返回的值(时间格式)转换为秒(最好是十进制,如果不是则为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。

请建议。

3 个答案:

答案 0 :(得分: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      |
+----------+------------------+

答案 1 :(得分:0)

打开和关闭括号是导致上述错误的问题:请尝试如下

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

答案 2 :(得分: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.';