A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 忘忧草 中级黑马   /  2012-4-16 09:16  /  1959 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如下电话账单:

要求输出流水账单(含通话时长)+总市话+总长话

--通话流水账单
select [CallerNumber]
      ,[TelNum]
      ,datediff(second,[StartDateTime],[EndDateTime]) as '通话时间'
from [mydb2].[dbo].[T_CallRecords1]

没问题

--总长话
select '长话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum Like '0%'

没问题

--总市话
select '市话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum not Like '0%'

也没问题

把三项加起来
--通话流水账单
select [CallerNumber]
      ,[TelNum]
      ,datediff(second,[StartDateTime],[EndDateTime]) as '通话时间'
from [mydb2].[dbo].[T_CallRecords1]
union all
--总长话
select '长话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum Like '0%'
union all
--总市话
select '市话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum not Like '0%'

问题来了!怎么解决?

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

4 个回复

倒序浏览
本帖最后由 柏云杉 于 2012-4-16 09:47 编辑

第二行的那个varchar字段[TelNum]转换成int失败,因为超过了int的最大范围。
你得把其他两个select查询中的第二个字段手动转换成varchar就可以了,用convert(varchar,[字段])

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
首先你的语句

select '长话时长',sum(datediff(second,StartDateTime,EndDateTime)),''from T_CallRecords1
就出现了''空格,和

select [CallerNumber] ,[TelNum] ,datediff(second,[StartDateTime],[EndDateTime]) as '通话时间'
from [mydb2].[dbo].[T_CallRecords1]
的列对不上,当你补充后,你试着将你语句中获取的时长转换成字符串形式,如Convert(nvarcahar(50),sum(datediff(second,StartDateTime,EndDateTime))),CallerNumber也转换成字符串形式,Convert(nvarchar(50),CallerNumber),总之,要用到Union all时,每个列的数据类型及长度要一样!

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
select [CallerNumber]
      ,[TelNum]
      ,datediff(second,[StartDateTime],[EndDateTime]) as '通话时间'
from [mydb2].[dbo].[T_CallRecords1]
union all
--总长话
select '长话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum Like '0%'
union all
--总市话
select '市话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum not Like '0%'


用 cast 或者 convert转换一下 sum(datediff(second,StartDateTime,EndDateTime)) 的数据类型,转换成varchar(50),

[TelNum]应为字符串类型,而与其对应的 sum(datediff(second,StartDateTime,EndDateTime))的为int类型,在转换int过程中[TelNum]的值超出了 int类型的数字上限.

本人也是刚学,如有说的不对的,请多多指教.

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
谢谢 我是先自己写再看的视频,刚在视频上看到了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马