首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一个sql的有关问题,大家进来看看吧,标题文字说不清楚

2013-07-04 
一个sql的问题,大家进来看看吧,标题文字说不清楚我有一个数据表是这样的表AID标识起始时间结止时间1A2013-

一个sql的问题,大家进来看看吧,标题文字说不清楚
我有一个数据表是这样的
表A
ID     标识   起始时间   结止时间
1       A     2013-7-2   2013-7-18
2       B     2013-7-19  2013-7-25
3       C     2013-7-30  2013-8-15
。。。。。。。。。。。。。。。。。。

要查询出来的结果是

时间排期


2日 3日 4日 5日.....18日 19日......25日 26日 27日 28日 29日 30日 31日.....
有    有   有   有 ..... 有     有   ......  有                                       有   有 ....


请问这样的sql要怎么写  SQL
[解决办法]


with tb(id,标识,起始时间,截至时间)as(
select 1,'a','2013-7-02','2013-7-18' union
select 2,'B','2013-7-19','2013-7-25' union
select 3,'C','2013-7-30','2013-8-15'
),tc as(
select a=DATEADD(day,number,起始时间) from tb,master..spt_values
where type='p' and DATEADD(day,number,起始时间)<=截至时间
),td as(
select distinct a=dateadd(day,number,(select MIN(起始时间) from tb)) from tb,master..spt_values
where type='p' 
and dateadd(day,number,(select MIN(起始时间) from tb))<=(select max(截至时间)from tb)
)
select td.a 日期,case when tc.a IS null then '' else '有' end 标识 
from td left join tc on td.a=tc.a
order by 1


写了一个,比较乱..
[解决办法]

create table Test_123
(
id int ,
表示 char(1),
起始时间 date,
截止时间 date
)

insert into Test_123 values (1,'A', '2013-7-2',' 2013-7-18' )


insert into Test_123 values (2,'B', '2013-7-19',' 2013-7-25' )
insert into Test_123 values (3,'C', '2013-7-30',' 2013-8-15' )

select * from Test_123


declare @i date
set @i='2013-07-02';
while @i<'2013-07-31'
begin
if exists(select * from Test_123 where @i between 起始时间 and 截止时间)
print cast(@i as varchar(16))+'有'
else
print cast(@i as varchar(16))+'无'
set @i= DATEADD(day, 1, @i) 
end


2013-07-02有
2013-07-03有
2013-07-04有
2013-07-05有
2013-07-06有
2013-07-07有
2013-07-08有
2013-07-09有
2013-07-10有
2013-07-11有
2013-07-12有
2013-07-13有
2013-07-14有
2013-07-15有
2013-07-16有
2013-07-17有
2013-07-18有
2013-07-19有
2013-07-20有
2013-07-21有
2013-07-22有
2013-07-23有
2013-07-24有
2013-07-25有
2013-07-26无
2013-07-27无
2013-07-28无
2013-07-29无
2013-07-30有




[解决办法]
declare @startdate datetime,@enddate datetime
set @startdate=dateadd(mm,datediff(mm,0,getdate()),0)
set @enddate=dateadd(ms,-2,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0))

select col,case when col >=c2 and col<=c3 then '有' else '' end 'aa' from (select convert(varchar(10),dateadd(day,number,@startdate),120) as col 
from
    master..spt_values 
where 
    datediff(day,dateadd(day,number,@startdate), @enddate)>=0
    and number>=0 
    and type='p')a,tb where id=1


[解决办法]

select 1 ID,'A' 标识,'2013-7-2' 起始时间,'2013-7-18' 结止时间
into #t
union all select 2,'B','2013-7-19','2013-7-25'
union all select 3,'C','2013-7-30','2013-8-15'

;with tStartEnd as
(
select min(起始时间)MinStart,max(结止时间) MaxEnd
from #t
),
tRangeDate as
(
select Convert(date, Dateadd(d,number,MinStart)) EventDate
from tStartEnd a
cross join master.[dbo].[spt_values] b
where b.[type]='p'
and Dateadd(d,number,MinStart)<=MaxEnd
)
select *,case when b.id is null then N'无' else N'有' end


as isEmpty
from tRangeDate a
left join  #t b
on a.EventDate between b.起始时间 and 结止时间


[解决办法]

create table 表A
(ID int, 
 标识 varchar(5), 
 起始时间 varchar(12), 
 结止时间 varchar(12))

insert into 表A
 select 1, 'A', '2013-7-2', '2013-7-18' union all
 select 2, 'B', '2013-7-19', '2013-7-25' union all
 select 3, 'C', '2013-7-30', '2013-8-15'


-- 竖表
select convert(varchar(11),dateadd(d,number,(select min(cast(起始时间 as datetime)) from 表A)),120) '日期',
       case when exists(select 1 from 表A where 
       convert(varchar(10),dateadd(d,number,(select min(cast(起始时间 as datetime)) from 表A)),120)
       between cast(起始时间 as datetime) and cast(结止时间 as datetime)) then '有' else '' end '标识'
 from master.dbo.spt_values
 where [type]='P'
 and number <=
 datediff(d,
 (select min(cast(起始时间 as datetime)) from 表A),
 (select max(cast(结止时间 as datetime)) from 表A))

/*
日期          标识
----------- ----
2013-07-02  有
2013-07-03  有
2013-07-04  有
2013-07-05  有
2013-07-06  有
2013-07-07  有
2013-07-08  有
2013-07-09  有
2013-07-10  有
2013-07-11  有
2013-07-12  有
2013-07-13  有
2013-07-14  有
2013-07-15  有
2013-07-16  有
2013-07-17  有
2013-07-18  有
2013-07-19  有
2013-07-20  有
2013-07-21  有
2013-07-22  有
2013-07-23  有
2013-07-24  有
2013-07-25  有
2013-07-26  
2013-07-27  
2013-07-28  
2013-07-29  
2013-07-30  有
2013-07-31  有
2013-08-01  有
2013-08-02  有
2013-08-03  有
2013-08-04  有
2013-08-05  有
2013-08-06  有
2013-08-07  有
2013-08-08  有
2013-08-09  有
2013-08-10  有
2013-08-11  有


2013-08-12  有
2013-08-13  有
2013-08-14  有
2013-08-15  有

(45 row(s) affected)
*/


[解决办法]

create table 表A
(ID int, 
 标识 varchar(5), 
 起始时间 varchar(12), 
 结止时间 varchar(12))

insert into 表A
 select 1, 'A', '2013-7-2', '2013-7-18' union all
 select 2, 'B', '2013-7-19', '2013-7-25' union all
 select 3, 'C', '2013-7-30', '2013-8-15'


-- 横表
declare @tsql varchar(6000)

select @tsql=isnull(@tsql,'')+stuff(
(select ',['+convert(varchar(11),dateadd(d,number,(select min(cast(起始时间 as datetime)) from 表A)),120)+']'
       
 from master.dbo.spt_values
 where [type]='P'
 and number <=
 datediff(d,
 (select min(cast(起始时间 as datetime)) from 表A),
 (select max(cast(结止时间 as datetime)) from 表A))
 for xml path('')),1,1,'')
 
select @tsql='
with t as
(select convert(varchar(10),dateadd(d,number,(select min(cast(起始时间 as datetime)) from 表A)),120) ''日期'',
        case when exists(select 1 from 表A where 
        convert(varchar(10),dateadd(d,number,(select min(cast(起始时间 as datetime)) from 表A)),120)
        between cast(起始时间 as datetime) and cast(结止时间 as datetime)) then ''有'' else '''' end ''标识''
 from master.dbo.spt_values
 where [type]=''P''
 and number <=
 datediff(d,
 (select min(cast(起始时间 as datetime)) from 表A),
 (select max(cast(结止时间 as datetime)) from 表A))
)
select '+@tsql
+' from t pivot(max(标识) for 日期 in('+@tsql+')) p '

exec(@tsql)

/*
2013-07-02  2013-07-03  2013-07-04  2013-07-05  2013-07-06  2013-07-07  2013-07-08  2013-07-09  2013-07-10  2013-07-11  2013-07-12  2013-07-13  2013-07-14  2013-07-15  2013-07-16  2013-07-17  2013-07-18  2013-07-19  2013-07-20  2013-07-21  2013-07-22  2013-07-23  2013-07-24  2013-07-25  2013-07-26  2013-07-27  2013-07-28  2013-07-29  2013-07-30  2013-07-31  2013-08-01  2013-08-02  2013-08-03  2013-08-04  2013-08-05  2013-08-06  2013-08-07  2013-08-08  2013-08-09  2013-08-10  2013-08-11  2013-08-12  2013-08-13  2013-08-14  2013-08-15 


----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有                                                           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有           有



(1 row(s) affected)
*/

热点排行