我有一条数据
姓名 开始日期    结束日期
张三 2012-10-10  2012-10-15怎么才能显示成这样的结果姓名  10月10日 10月11日  10月12日  10月12日  10月14日 10月15日
张三      1       1          1        1         1        1

解决方案 »

  1.   

    --> 测试数据:[ta]
    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 行受影响)*/
      

  2.   


    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 行受影响)*/
      

  3.   

    create table #t
    (
    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
      

  4.   

    --> 测试数据: #tb
    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
    */
      

  5.   


    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
    */
      

  6.   


    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
     
      

  7.   

     
    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