日期:2014-05-18  浏览次数:20466 次

日期时间段分割处理!
根据日期时间段,得到每周的日期时间段。
例如:
      数据:
      001   ,   2007/04/16   ,   2007/04/29  
      002   ,   2007/04/23   ,   2007/04/29

      得到数据:
      001   ,   2007/04/16   ,   2007/04/22  
      001   ,   2007/04/23   ,   2007/04/29  
      002   ,   2007/04/23   ,   2007/04/29

------解决方案--------------------


select id ,StartDate, '2007/04/22 ' as EndDate
from table1
when StartDate < '2007/04/23 ' and EndDate> '2007/04/22 '

union
select id , '2007/04/23 ' as StartDate, EndDate
from table1
when StartDate < '2007/04/23 ' and EndDate> '2007/04/22 '

union
select id ,StartDate, EndDate
from table1
when StartDate> = '2007/04/23 ' or EndDate <= '2007/04/22 '


------解决方案--------------------
目前除了用游标,还没想到别的思路。。。
------解决方案--------------------
create function getTableG(@a varchar(3),@s smalldatetime,@e smalldatetime)
returns @t table(m varchar(3),n smalldatetime,p smalldatetime)
as
begin
declare @y table (a int identity(0,1),c smalldatetime,d smalldatetime,b char(1))

insert @y(c,d,b) select @s,null,null from syscolumns
update @y set d=dateadd(day,a,c)
delete from @y where d> @e
update @y set b= '1 ' where datepart(dw,d)=2
update @y set b= '7 ' where datepart(dw,d)=1
update @y set b= '1 ' where d=@s and b is null
update @y set b= '7 ' where d=@e and b is null
delete from @y where b is null
if exists(select 1 from @y where b=7 and d=@s)
insert @t select @a,@s,@s
if exists(select 1 from @y where b=1 and d=@e)
begin
insert @t select @a,@e,@e
insert @t select @a,d,null from @y where b=1 and d <> @e
end
else
insert @t select @a,d,null from @y where b=1
update @t set p=d from @t,@y where datediff(day,n,d)=6 and p is null
update @t set p=@e where p is null
return
end

go
declare @a table(a varchar(3),s smalldatetime,e smalldatetime)
insert @a select '001 ', '2007/04/16 ', '2007/04/29 '
union all select '002 ' , '2007/04/23 ', '2007/04/29 '
union all select '003 ' , '2007/04/24 ', '2007/05/29 '

declare @i varchar(3),@o smalldatetime,@e smalldatetime
declare @g table(a varchar(3),s smalldatetime,e smalldatetime)

declare cur cursor for
select * from @a order by a
open cur
fetch next from cur into @i,@o,@e
while @@fetch_status=0
begin
insert @g select * from dbo.gettableG(@i,@o,@e)
fetch next from cur into @i,@o,@e
end
close cur
deallocate cur
select * from @g


------解决方案--------------------
如果統計用的話,不防建一個每年的周時間表.

第十六周 16 2007-04-16 00:00:00 2007-04-22 00:00:00
........ 17 2007-04-23 00:00:00 2007-04-29 00:00:00

select a.name,b.startdate,b.enddate
from tmpTestdate a,tmpWeek b
where a.bgndate=b.startdate or a.enddate=b.enddate

result:

001 2007-04-16 00:00:00 2007-04-22 00:00:00