服务器 频道

Sql Server问题摘要

  【IT168 服务器学院】1.         合并若干个表?

  描述:建立一个新表,其字段结构是其他若干个表Join以后的结果。

  解决思路:select * into 新表名 from 旧表1名,旧表2名,……

  实例:

  --表NewTableName的字段为表titles和titleauthor字段表相加;

  ---记录为记录为select * from titles,titleauthor的记录

  select * into NewTableName from titles,titleauthor

  --表NewTableName的字段[title_id,title,au_id]

  -- 记录为select a.title_id,a.title,b.au_id from titles a,titleauthor b where a.title_id=b.title_id

  select a.title_id,a.title,b.au_id into NewTableName from titles a,titleauthor b where a.title_id=b.title_id

  2.         查询N-M条记录?

  描述:要从记录集中取出中间一段记录来(如: 取10条中的第3-8条)

  解决思路:

  1.       有关键字或确保唯一的候选关键字字段:

  方法1:从第n条记录开始取m-n+1条数据                   

  方法2:升序取前m条记录最为a, 再降序从a中取m-n+1条记录作为b

  2.       没有上述字段:

  增加一个自增字段生成一个临时表,在从临时表中取记录[Where 自增字段名>n-1]

  实例:      --

       --取第4到第7条记录 [对1方法一]

  SELECT top 4 * FROM jobs WHERE job_id not in (SELECT top 3 job_id FROM jobs)

  --[方法二]

  SELECT top 4 * FROM

  (SELECT top 4 * FROM

  (SELECT top 7 * FROM jobs ORDER BY job_id ASC)  a

  ORDER BY job_id DESC

  ) b

  ORDER BY job_id ASC

  --取第2到第3条记录 [对1方法一]

  select IDENTITY(int,1,1) as iid,* into #temptable from discounts select top 2 * from #temptable where iid>=2

  3.         按年度季度统计汇总?

  描述: 统计表employee的各年度各季度的雇佣人数

  解决思路:Group by 和 [函数datepart()]   

  实例:

           //季度:quarter

  SELECT year(hire_date) 年度,datepart(q,hire_date) 季度,count(emp_id)雇佣人数 FROM employee

  GROUP BY year(hire_date),datepart(q,hire_date)

  ORDER BY 年度,季度

  4.         随机取n条记录?

  描述: 从表中随机提取n条记录

  解决思路:按照用Guid

  实例:

           --从表中随机取5条记录

  SELECT top 5 * FROM titles ORDER BY newid()

  5.         求出任意时间所在季度的天数?

  描述: 如题

  解决思路:注意闰年

  实例:

  declare @t smalldatetime

  select @t = ''2001-4-1''

  select case datepart(quarter,@t)

                    when 1 then

  (case when (year(@t)%4=0 and year(@t)%100<>0) or year(@t)%400=0 then 91 else 90 end)

                    when 2 then 91

                    when 3 then 92

                    when 4 then 92

        end

  6.         求出任意时间的季度的第一天?

  描述: 如题

  解决思路: 如下

  实例:

  -- [思路:把日期向前推到季度的第一个月的当前号

  --注意:5月31号不会推成4月31号 ,系统自动转为30号

  declare @d datetime

  set @d=''2003-5-31''

  select @d as 指定日期,

  dateadd(month,-(month(@d)-1)%3,@d)-day(dateadd(month,-(month(@d)-1)%3,@d))+1 as 季度的第一天

  -- [思路:分别求出年月日在转为日期型]

  declare @t smalldatetime

  select @t = ''2001-9-30''

  select cast(cast(year(@t) as varchar) + ''-'' + cast(3*datepart(q,@t)-2 as varchar) + ''-1'' as datetime)

  --求当前的日期季度的第一天

  select cast(cast(year(getdate()) as varchar) + ''-'' + cast(3*datepart(q,getdate())-2 as varchar) + ''-1'' as datetime)

  7.         时间重叠度的问题?

  描述:

  create table #a(id int identity(1,1),date1 datetime,date2 datetime)

  insert #a select ''2004-02-29 16:45:00'',''2004-02-29 20:45:00''

  union all select ''2004-02-29 18:45:00'',''2004-02-29 22:45:00''

  union all select ''2004-03-01 10:45:00'',''2004-03-01 13:45:00''

  union all select ''2004-03-01 13:45:00'',''2004-03-01 16:45:00''

  union all select ''2004-03-01 13:47:00'',''2004-03-01 14:25:00''

  union all select ''2004-03-01 16:45:00'',''2004-03-01 19:15:00''

  union all select ''2004-03-01 17:45:00'',''2004-03-01 18:55:00''

  union all select ''2004-03-01 18:45:00'',''2004-03-01 21:45:00''

  select *from #a

  我现在要找出时间上重叠超过1个小时的所有记录!

  比如第1、2条:一个是从16:45---20:45,第二条是从18:45---22:45时间上重叠了2个小时,所以这两条都要取出,其它的也是一样的规则!

  date2-date1小于1小时的不用考虑,如第5条。可以先删除该条,记录是按date1排序的!

  所以最终的结果要为:

  id          date1                       date2                      

  ----------- --------------------------- ---------------------------

  1           2004-02-29 16:45:00.000     2004-02-29 20:45:00.000

  2           2004-02-29 18:45:00.000     2004-02-29 22:45:00.000

  6           2004-03-01 16:45:00.000     2004-03-01 19:15:00.000

  7           2004-03-01 17:45:00.000     2004-03-01 18:55:00.000

  解决思路:

  实例:

  --方案一:[作者:“victorycyz(中海,干活去了,不在CSDN玩。)”]

  select distinct a.*

  from #a a , #a b

  where a.id<>b.id and

        a.date1<b.date2 and a.date2>b.date1 and

        (case when a.date2>b.date2 then b.date2 else a.date2 end)-

        (case when a.date1>b.date1 then a.date1 else b.date1 end)>1/24.0

  --方案二:[作者:“j9988(j9988)”]

  select * from #a A where

  exists(select 1 from #a

         where id<>A.id

          and dateadd(minute,60,date1)<date2

          and (date1 between A.date1 and A.date2)

          and abs(datediff(minute,date1,A.date2))>=60)

  or

  exists(select 1

         from #a

         where id<>A.id

         and dateadd(minute,60,A.date1)<A.date2

         and (A.date1 between date1 and date2)

         and abs(datediff(minute,A.date1,date2))>=60) 

0
相关文章