SQL Server 2008-计算平均计时
我有一个问题SQL Server 2008-计算平均计时,sql,sql-server-2008,Sql,Sql Server 2008,我有一个问题 select *, right( convert(varchar, cast(JOB_DONE_time-JOB_send_time as datetime), 121), 12 ) [TimeTaken] from dbo.insert_data order by job_id desc 这个查询的结果如下 JOB_ID JOB_DONE_TIME JOB_SEND_TIME TimeTaken
select
*,
right(
convert(varchar, cast(JOB_DONE_time-JOB_send_time as datetime), 121),
12
) [TimeTaken]
from dbo.insert_data
order by job_id desc
这个查询的结果如下
JOB_ID JOB_DONE_TIME JOB_SEND_TIME TimeTaken
--------- ----------------------- ----------------------- ------------
001-99900 2011-12-28 13:36:57.860 2011-12-28 13:36:57.593 00:00:00.267
001-99800 2011-12-28 13:36:57.843 2011-12-28 13:36:57.593 00:00:00.250
001-99700 2011-12-28 13:36:57.687 2011-12-28 13:36:57.547 00:00:00.140
001-99600 2011-12-28 13:36:57.593 2011-12-28 13:36:57.547 00:00:00.047
001-99500 2011-12-28 13:36:57.563 2011-12-28 13:36:57.437 00:00:00.127
001-99400 2011-12-28 13:36:57.547 2011-12-28 13:36:57.437 00:00:00.110
001-99300 2011-12-28 13:36:57.483 2011-12-28 13:36:57.377 00:00:00.107
001-99200 2011-12-28 13:36:57.437 2011-12-28 13:36:57.377 00:00:00.060
001-99100 2011-12-28 13:36:57.407 2011-12-28 13:36:57.187 00:00:00.220
001-99000 2011-12-28 13:36:57.360 2011-12-28 13:36:57.187 00:00:00.173
001-9900 2011-12-28 13:32:22.657 2011-12-28 13:32:22.500 00:00:00.127
通过这个查询,我得到了timetake
列。现在我想计算列的加法和平均值timetake
。我尝试了SUM()
函数,但它给了我错误:
Msg 8117,级别16,状态1,第1行操作数数据类型varchar为 对求和运算符无效
如何计算它?在sql中使用avg函数,它将为列提供avg
SELECT AVG(column name) FROM tabelname;
总的来说,像这样使用
SELECT sum(column name) FROM tabelname;
您可以确定“完成”和“发送”时间列的日期差(以毫秒为单位),然后对这些结果进行平均或求和
select sum(datediff(ms, JOB_send_time, JOB_DONE_time)) as SUM_Timing
, avg(datediff(ms, JOB_send_time, JOB_DONE_time)) as AVG_Timing
from dbo.insert_data
我认为(对不起,现在不能尝试)您需要DATEDIFF
就你而言:
select avg(DATEDIFF(Millisecond, JOB_DONE_time, JOB_send_time)) from dbo.insert_data
正如已经告诉您的,问题与您试图将
AVG()
或SUM()
应用于字符串列有关,而实际上您只能在数字列上使用这些函数
作为一个非常特定于SQL Server的解决方案,您可以临时将JOB\u DONE\u time-JOB\u send\u time
的结果强制转换为float
,计算AVG()
和/或SUM()
,然后将结果转换回datetime
,然后转换为varchar
,然后提取最后12个字符,就像你现在对减法的非聚合结果所做的那样
这里有一个例子来说明我的意思:
SELECT
JOB_ID,
JOB_DONE_TIME,
JOB_SEND_TIME,
TimeTaken = RIGHT(CONVERT(varchar(30), CAST( TimeTakenFP AS datetime), 121), 12),
AvgTimeTaken = RIGHT(CONVERT(varchar(30), CAST(AVG(TimeTakenFP) OVER () AS datetime), 121), 12),
TotalTimeTaken = RIGHT(CONVERT(varchar(30), CAST(SUM(TimeTakenFP) OVER () AS datetime), 121), 12)
FROM (
SELECT
*,
TimeTakenFP = CAST(JOB_DONE_TIME - JOB_SEND_TIME AS float)
FROM insert_data
) s
;
对于示例数据,上述查询返回以下结果集:
JOB_ID JOB_DONE_TIME JOB_SEND_TIME TimeTaken AvgTimeTaken TotalTimeTaken
--------- ----------------------- ----------------------- ------------ ------------ --------------
001-99900 2011-12-28 13:36:57.860 2011-12-28 13:36:57.593 00:00:00.267 00:00:00.150 00:00:01.657
001-99800 2011-12-28 13:36:57.843 2011-12-28 13:36:57.593 00:00:00.250 00:00:00.150 00:00:01.657
001-99700 2011-12-28 13:36:57.687 2011-12-28 13:36:57.547 00:00:00.140 00:00:00.150 00:00:01.657
001-99600 2011-12-28 13:36:57.593 2011-12-28 13:36:57.547 00:00:00.047 00:00:00.150 00:00:01.657
001-99500 2011-12-28 13:36:57.563 2011-12-28 13:36:57.437 00:00:00.127 00:00:00.150 00:00:01.657
001-99400 2011-12-28 13:36:57.547 2011-12-28 13:36:57.437 00:00:00.110 00:00:00.150 00:00:01.657
001-99300 2011-12-28 13:36:57.483 2011-12-28 13:36:57.377 00:00:00.107 00:00:00.150 00:00:01.657
001-99200 2011-12-28 13:36:57.437 2011-12-28 13:36:57.377 00:00:00.060 00:00:00.150 00:00:01.657
001-99100 2011-12-28 13:36:57.407 2011-12-28 13:36:57.187 00:00:00.220 00:00:00.150 00:00:01.657
001-99000 2011-12-28 13:36:57.360 2011-12-28 13:36:57.187 00:00:00.170 00:00:00.150 00:00:01.657
001-9900 2011-12-28 13:32:22.657 2011-12-28 13:32:22.500 00:00:00.157 00:00:00.150 00:00:01.657
作业\u ID作业\u完成\u时间作业\u发送\u花费的时间AvgTimeTaken总计花费的时间
--------- ----------------------- ----------------------- ------------ ------------ --------------
001-99900 2011-12-28 13:36:57.860 2011-12-28 13:36:57.593 00:00:00.267 00:00:00.150 00:00:01.657
001-99800 2011-12-28 13:36:57.843 2011-12-28 13:36:57.593 00:00:00.250 00:00:00.150 00:00:01.657
001-99700 2011-12-28 13:36:57.687 2011-12-28 13:36:57.547 00:00:00.140 00:00:00.150 00:00:01.657
001-99600 2011-12-28 13:36:57.593 2011-12-28 13:36:57.547 00:00:00.047 00:00:00.150 00:00:01.657
001-99500 2011-12-28 13:36:57.563 2011-12-28 13:36:57.437 00:00:00.127 00:00:00.150 00:00:01.657
001-99400 2011-12-28 13:36:57.547 2011-12-28 13:36:57.437 00:00:00.110 00:00:00.150 00:00:01.657
001-99300 2011-12-28 13:36:57.483 2011-12-28 13:36:57.377 00:00:00.107 00:00:00.150 00:00:01.657
001-99200 2011-12-28 13:36:57.437 2011-12-28 13:36:57.377 00:00:00.060 00:00:00.150 00:00:01.657
001-99100 2011-12-28 13:36:57.407 2011-12-28 13:36:57.187 00:00:00.220 00:00:00.150 00:00:01.657
001-99000 2011-12-28 13:36:57.360 2011-12-28 13:36:57.187 00:00:00.170 00:00:00.150 00:00:01.657
001-9900 2011-12-28 13:32:22.657 2011-12-28 13:32:22.500 00:00:00.157 00:00:00.150 00:00:01.657
此查询使用聚合函数计算聚合结果,以便您可以看到聚合结果和非聚合结果。我只使用窗口函数,因为我想向您展示如何将显示时间的方法应用于非聚合结果和聚合结果,以便您可以看到表达式的哪一部分根据需要转换为时间表示的结果的类型而变化。实际上,如果您需要的话,您可以使用“正常”聚合结果(以及分组,如果必要的话)
您可以玩查询的“实时”演示。您遇到了什么错误?(请提供完整准确的错误消息!)Msg 8117,16级,状态1,第1行操作数数据类型varchar对于sum运算符无效。Msg 8117,级别16,状态1,第1行操作数数据类型varchar对于avg运算符无效。请尝试在avg上发布查询和一些示例数据,avg仅接受数字,avg的参数是varchar?“Msg 8117,16级,状态1,第1行操作数数据类型varchar对sum运算符无效。Msg 8117,16级,状态1,第1行操作数数据类型varchar对avg运算符无效。-Rikky”嗯,消息似乎非常清楚:您不能对
varchar
列求和!如果要求和-它必须是像INT
之类的数字数据类型或其他类型。@Marc\u s-表中除日期时间格式的JOB\u ID之外的所有列。获取以下错误消息8117,级别16,状态1,第1行操作数数据类型varchar对于求和运算符无效。Msg 8117,级别16,状态1,第1行操作数数据类型varchar对于avg运算符无效。