我有一条数据
姓名 开始日期 结束日期
张三 2012-10-10 2012-10-15怎么才能显示成这样的结果姓名 10月10日 10月11日 10月12日 10月12日 10月14日 10月15日
张三 1 1 1 1 1 1
姓名 开始日期 结束日期
张三 2012-10-10 2012-10-15怎么才能显示成这样的结果姓名 10月10日 10月11日 10月12日 10月12日 10月14日 10月15日
张三 1 1 1 1 1 1
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([姓名] VARCHAR(4),[开始日期] DATETIME,[结束日期] DATETIME)
INSERT [ta]
SELECT '张三','2012-10-10','2012-10-15'
--------------开始查询--------------------------
DECLARE @i VARCHAR(10) ,@sql VARCHAR(MAX),@name VARCHAR(10),@beginDate DATETIME,@endDate DATETIME
SELECT TOP 1 @name=[姓名],@beginDate=[开始日期],@endDate=[结束日期] FROM [ta] WHERE [姓名]='张三'
SET @i='1'
WHILE @beginDate<@endDate
BEGIN
SET @sql=ISNULL(@sql+',','')+@i+' AS ['+CONVERT(VARCHAR(10),@beginDate+1,120)+']'
SET @beginDate=@beginDate+1
END
SET @sql='SELECT '''+@name+''' AS [姓名],'+@sql
EXEC(@sql)----------------结果----------------------------
/*
姓名 2012-10-11 2012-10-12 2012-10-13 2012-10-14 2012-10-15
---- ----------- ----------- ----------- ----------- -----------
张三 1 1 1 1 1(1 行受影响)*/
DECLARE @i VARCHAR(10) ,@sql VARCHAR(MAX),@name VARCHAR(10),@beginDate DATETIME,@endDate DATETIME
SELECT TOP 1 @name=[姓名],@beginDate=[开始日期],@endDate=[结束日期] FROM [ta] WHERE [姓名]='张三'
SET @i='1'
WHILE @beginDate<=@endDate
BEGIN
SET @sql=ISNULL(@sql+',','')+@i+' AS ['+CONVERT(VARCHAR(10),@beginDate,120)+']'
SET @beginDate=@beginDate+1
END
SET @sql='SELECT '''+@name+''' AS [姓名],'+@sql
EXEC(@sql)----------------结果----------------------------
/*
姓名 2012-10-10 2012-10-11 2012-10-12 2012-10-13 2012-10-14 2012-10-15
---- ----------- ----------- ----------- ----------- ----------- -----------
张三 1 1 1 1 1 1(1 行受影响)*/
(
name nvarchar(10),
StartDate datetime,
EndDate datetime
)
insert #t
select N'张三', '2012-10-10', '2012-10-15'
select * from #t--sql:
;with cte_1 as
(
select
A.name,
TheDate = convert(char(10), A.StartDate + number, 120),
status = 1
from
(
select
*,
diff = datediff(day, StartDate, EndDate)
from #t
) A
cross apply
(
select top(A.diff+1) number
from master..spt_values where type = 'P'
) B
)
select *
from cte_1 A
pivot
(max(status) for TheDate in([2012-10-10],[2012-10-11],[2012-10-12],[2012-10-13],[2012-10-14],[2012-10-15])) B/*
name 2012-10-10 2012-10-11 2012-10-12 2012-10-13 2012-10-14 2012-10-15
张三 1 1 1 1 1 1
*/
--实现全部功能需要用动态SQL.行转列或用case when
if object_id('tempdb.dbo.#tb') is not null drop table #tb
create table #tb ([姓名] varchar(4),[开始日期] datetime,[结束日期] datetime)
insert into #tb
select '张三','2012-10-10','2012-10-15'--构造数字辅助表Num
if OBJECT_ID('Num') is not null drop table Num
create table Num(id int not null)
declare @i int=0
while @i<100
begin
insert into Num values(@i)
set @i=@i+1
end
--获取从开始日期到结束日期为止的所有连续日期
declare @md nvarchar(500)
select @md=ISNULL(@md+',','')+'['+CONVERT(nchar(10),连续日期,23)+']' from
(
select dateadd(DD,id,[开始日期])连续日期 from #tb cross join num where id<6
) as t
--行列转换
exec('select * from
(
select [姓名],convert(nchar(10),dateadd(DD,id,[开始日期]),23)连续日期 from #tb cross join num where id<6
) as t
pivot(count([连续日期]) for 连续日期 in('+@md+')) as p')
--查询结果
/*
姓名 2012-10-10 2012-10-11 2012-10-12 2012-10-13 2012-10-14 2012-10-15
---- ----------- ----------- ----------- ----------- ----------- -----------
张三 1 1 1 1 1 1
*/
IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'tba')
BEGIN
DROP TABLE tba
END
GO
CREATE TABLE tba
(
姓名 VARCHAR(10),
开始日期 VARCHAR(10),
结束日期 VARCHAR(10)
)
GO
INSERT INTO tba
SELECT '张三', '2012-10-10', '2012-10-15'
GODECLARE @Sql VARCHAR(1000)SET @Sql = 'SELECT 姓名,' +
stuff(( SELECT ',' + '1 AS ''' + Date + ''''
FROM ( SELECT LTRIM(DATEPART(MONTH,DATEADD(DAY,number,开始日期))) + '月' + LTRIM(DATEPART(DAY,DATEADD(DAY,number,开始日期))) + '日' AS Date
FROM tba AS A,master..spt_values AS B
WHERE B.type = 'P' AND number < DATEDIFF(DAY,开始日期,结束日期) + 1) AS T for xml path('')),1,1,'') + '
FROM tba'
EXEC (@sql)--结果
/*
姓名 10月10日 10月11日 10月12日 10月13日 10月14日 10月15日
张三 1 1 1 1 1 1
*/
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([姓名] VARCHAR(4),[开始日期] DATETIME,[结束日期] DATETIME)
INSERT [ta]
SELECT '张三','2012-10-10','2012-10-15';
--------------开始查询--------------------------
with tb as(
select [开始日期],[结束日期],
convert(varchar(max), 'select '''+[姓名]+''','''+convert(varchar(30),[开始日期],23)+''',' )as 连续时间
from [ta] where [姓名]='张三' and [开始日期]<=[开始日期] union all
select dateadd(day,1,[开始日期])as[开始日期] ,[结束日期] ,
convert(varchar(max), [连续时间]+''''+convert(varchar(20),[开始日期],23)+''',') as [连续时间]from tb
where [开始日期]<=[结束日期]
)
select 连续时间 into #c from tb declare @str varchar(max)
select @str=max(连续时间) from #c
set @str= LEFT(@str,LEN(@str)-1)
exec (@str)
drop table #c
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([姓名] VARCHAR(4),[开始日期] DATETIME,[结束日期] DATETIME)
INSERT [ta]
SELECT '张三','2012-10-10','2012-10-17'
--------------开始查询--------------------------
declare @tb table ( 连续时间 varchar(max))
;with tb as(
select *,
convert(varchar(max),
'select ''姓名'',' )as 连续时间,
convert(varchar(max),'select '''+[姓名]+'''') as 连续时间2
from [ta] where [姓名]='张三' and [开始日期]<=[开始日期] union all
select [姓名],dateadd(day,1,[开始日期])as[开始日期] ,[结束日期] ,
convert(varchar(max), [连续时间]+''''+convert(varchar(20),[开始日期],23)+''',') as [连续时间],
convert(varchar(max),连续时间2+',''1''')
from tb
where [开始日期]<=[结束日期]
)
insert @tb
select max(连续时间)+'union all '+max(连续时间2) from tb
declare @str varchar(max)
set @str=(select replace(连续时间,',union','union') from @tb)
exec (@str)
结果 :姓名
2012-10-10 2012-10-11 2012-10-12 2012-10-13 2012-10-14 2012-10-15 2012-10-16 2012-10-17
张三 1 1 1 1 1 1 1 1