SQL SERVER2005中的那些事

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

 这几天的工作都是和数据库打交道,今天抽空总结下最近遇到的问题。

1.datetime字段模糊查询?


 
 
  1. USE SICCDB 
  2. GO 
  3. SELECT 
  4.     StartTime 
  5. FROM 
  6.     dbo.WGS_MainCDR 
  7. WHERE 
  8.     StartTime LIKE '2012-06-20%' 

大家猜测下,这样可以查询出结果吗? 

注:表中时间字段查询的结果:

那上面那句的T-SQL语句执行的结果呢?我们来看下:

我们发现查询的结果什么也没有。上面的T-SQL语句在05中是什么都没有查询到,在其他数据库里可能会出现错误。

要解决这种问题,可以有三种方法:

  • 使用convert()函数转换datetime类型为String类型查询

 
 
  1. USE SICCDB  
  2. GO  
  3. SELECT  
  4.     STARTTIME 
  5. FROM  
  6.     dbo.WGS_MainCDR  
  7. WHERE  
  8.     CONVERT(CHAR(10),STARTTIME,120) LIKE '2012-06-20%' 
  • between查询

 
 
  1. USE SICCDB  
  2. GO  
  3. SELECT  
  4.     STARTTIME 
  5. FROM  
  6.     dbo.WGS_MainCDR  
  7. WHERE  
  8.     STARTTIME BETWEEN '2012-06-20 12:00:00.000' AND '2012-06-21 12:00:00.000' 
  • datediff()函数查询

 
 
  1. USE SICCDB  
  2. GO  
  3. SELECT  
  4.     STARTTIME 
  5. FROM  
  6.     dbo.WGS_MainCDR  
  7. WHERE  
  8.     DATEDIFF(yyyy,STARTTIME,'2012')=0 

第一种方法应该适用与任何数据类型;具体用法看这里
第二种方法适用String外的类型;
第三种方法则是为date类型定制的比较实用快捷的方法。具体用法看这里

2.SQLSERVER2005中怎么导出包含插入语句的SQL?

额,是不是你也遇到过这个问题,很纠结呢?通常情况下,SQLSERVER2005中并没有这种功能?只可以导出一些创建数据库和建表的SQL。

我们可以写个存储过程:


 
 
  1. CREATE PROCEDURE dbo.UspOutputData  
  2. @tablename sysname  
  3. AS  
  4. declare @column varchar(1000)  
  5. declare @columndata varchar(1000)  
  6. declare @sql varchar(4000)  
  7. declare @xtype tinyint  
  8. declare @name sysname  
  9. declare @objectId int  
  10. declare @objectname sysname  
  11. declare @ident int  
  12.  
  13. set nocount on  
  14. set @objectId=object_id(@tablename)  
  15.  
  16. if @objectId is null -- 判断对象是否存在  
  17. begin  
  18. print 'The object not exists'  
  19. return  
  20. end  
  21. set @objectname=rtrim(object_name(@objectId))  
  22.  
  23. if @objectname is null or charindex(@objectname,@tablename)=0 --此判断不严密  
  24. begin  
  25. print 'object not in current database'  
  26. return  
  27. end  
  28.  
  29. if OBJECTPROPERTY(@objectId,'IsTable') < > 1 -- 判断对象是否是table  
  30. begin  
  31. print 'The object is not table'  
  32. return  
  33. end  
  34.  
  35. select @ident=status&0x80 from syscolumns where id=@objectid and status&0x80=0x80  
  36.  
  37. if @ident is not null  
  38. print 'SET IDENTITY_INSERT '+@TableName+' ON'  
  39.  
  40. declare syscolumns_cursor cursor  
  41.  
  42. for select c.name,c.xtype from syscolumns c where c.id=@objectid order by c.colid  
  43.  
  44. open syscolumns_cursor  
  45. set @column=''  
  46. set @columndata=''  
  47. fetch next from syscolumns_cursor into @name,@xtype  
  48.  
  49. while @@fetch_status < >-1  
  50. begin  
  51. if @@fetch_status < >-2  
  52. begin  
  53. if @xtype not in(189,34,35,99,98) --timestamp不需处理,image,text,ntext,sql_variant 暂时不处理  
  54.  
  55. begin  
  56. set @column=@column+case when len(@column)=0 then'' else ','end+@name  
  57.  
  58. set @columndata=@columndata+case when len(@columndata)=0 then '' else ','','','  
  59. end  
  60.  
  61. +case when @xtype in(167,175) then '''''''''+'+@name+'+''''''''' --varchar,char  
  62. when @xtype in(231,239) then '''N''''''+'+@name+'+''''''''' --nvarchar,nchar  
  63. when @xtype=61 then '''''''''+convert(char(23),'+@name+',121)+''''''''' --datetime  
  64. when @xtype=58 then '''''''''+convert(char(16),'+@name+',120)+''''''''' --smalldatetime  
  65. when @xtype=36 then '''''''''+convert(char(36),'+@name+')+''''''''' --uniqueidentifier  
  66. else @name end  
  67.  
  68. end  
  69.  
  70. end  
  71.  
  72. fetch next from syscolumns_cursor into @name,@xtype  
  73.  
  74. end  
  75.  
  76. close syscolumns_cursor  
  77. deallocate syscolumns_cursor  
  78.  
  79. set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename  
  80.  
  81. print '--'+@sql  
  82. exec(@sql)  
  83.  
  84. if @ident is not null  
  85. print 'SET IDENTITY_INSERT '+@TableName+' OFF'  
  86.  
  87. GO 

 exec UspOutputData 表名

在上面执行的结果中点击右键--》将结果另存为.sql文件就大功告成啦。

3.求时间段的平均值

我们同样用DATEDIFF()函数来做。DATEDIFF(SECOND,STARTTIME,ENDTIME)用结束时间-开始时间取秒为单位。外面用AVG()函数,AVG(DATEDIFF(SECOND,STARTTIME,ENDTIME))

4.比较纠结的二表查询,结果为统计和行转列

第一个表WGS_MainCDR:

第二个表WGS_QueuePhase:

我们需要查询:每日分机进线量(CALLTYPE=0)、进线应答量(CALLTYPE=0和ANSWERTIME不为空、外拨量(CALLTYPE=1)、外拨应答量(CALLTYPE=1和ANSWERTIME不为空、平均通话时长(总时长/每日进线量)

 先单个查询出统计日期、分机进线量、分机进线应答量、分机外拨量、分机外拨应答量、进线通话时长和外拨通话时长:


 
 
  1. SELECT  
  2.         CONVERT(CHAR(10),ALERTTIME, 120) AS 统计日期, 
  3.         SUM(CASE WHEN M.CALLTYPE = 0 THEN 1 ELSE 0 ENDAS 分机进线量, 
  4.         SUM(CASE WHEN M.CALLTYPE = 0 AND E.ANSWERTIME IS NOT NULL THEN 1 ELSE 0 ENDAS 分机进线应答量, 
  5.         SUM(CASE WHEN M.CALLTYPE = 1 THEN 1 ELSE 0 ENDAS 分机外拨量, 
  6.         SUM(CASE WHEN M.CALLTYPE = 1 AND E.ANSWERTIME IS NOT NULL THEN 1 ELSE 0 ENDAS 分机外拨应答量, 
  7.         SUM(CASE WHEN M.CALLTYPE = 0 AND E.ANSWERTIME IS NOT NULL THEN DATEDIFF(SECOND,E.ANSWERTIME,E.ENDTIME) ELSE 0 ENDAS 进线通话时长, 
  8.         SUM(CASE WHEN M.CALLTYPE = 1 AND E.ANSWERTIME IS NOT NULL THEN DATEDIFF(SECOND,E.ANSWERTIME,E.ENDTIME) ELSE 0 ENDAS 外拨通话时长 
  9.     FROM  
  10.         WGS_ExtensionPhase E  
  11.         LEFT JOIN WGS_MainCDR M ON E.UCID = M.UCID  
  12.     GROUP BY CONVERT(CHAR(10),ALERTTIME, 120) 

下面将行转列:


 
 
  1. use siccdb 
  2. go 
  3. SELECT 
  4.     *, 
  5.     CASE 分机进线量 WHEN 0 THEN 0 ELSE ROUND((进线通话时长 / 分机进线量),2) END AS 平均进线通话时长, 
  6.     CASE 分机进线量 WHEN 0 THEN 0 ELSE ROUND((外拨通话时长 / 分机进线量),2) END AS 平均外拨通话时长 
  7. FROM ( 
  8.     SELECT  
  9.         CONVERT(CHAR(10),ALERTTIME, 120) AS 统计日期, 
  10.         SUM(CASE WHEN M.CALLTYPE = 0 THEN 1 ELSE 0 ENDAS 分机进线量, 
  11.         SUM(CASE WHEN M.CALLTYPE = 0 AND E.ANSWERTIME IS NOT NULL THEN 1 ELSE 0 ENDAS 分机进线应答量, 
  12.         SUM(CASE WHEN M.CALLTYPE = 1 THEN 1 ELSE 0 ENDAS 分机外拨量, 
  13.         SUM(CASE WHEN M.CALLTYPE = 1 AND E.ANSWERTIME IS NOT NULL THEN 1 ELSE 0 ENDAS 分机外拨应答量, 
  14.         SUM(CASE WHEN M.CALLTYPE = 0 AND E.ANSWERTIME IS NOT NULL THEN DATEDIFF(SECOND,E.ANSWERTIME,E.ENDTIME) ELSE 0 ENDAS 进线通话时长, 
  15.         SUM(CASE WHEN M.CALLTYPE = 1 AND E.ANSWERTIME IS NOT NULL THEN DATEDIFF(SECOND,E.ANSWERTIME,E.ENDTIME) ELSE 0 ENDAS 外拨通话时长 
  16.     FROM  
  17.         WGS_ExtensionPhase E  
  18.         LEFT JOIN WGS_MainCDR M ON E.UCID = M.UCID  
  19.     GROUP BY CONVERT(CHAR(10),ALERTTIME, 120) 
  20. ) A 

 本文转自shyy8712872 51CTO博客,原文链接:http://blog.51cto.com/shuyangyang/962956,如需转载请自行联系原作者


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
SQL 测试技术 数据库

热门文章

最新文章