读书人

一个sql的有关问题大家进来看看吧

发布时间: 2013-07-04 11:45:51 作者: rapoo

一个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)
*/

读书人网 >SQL Server

热点推荐