2016-09-26 58 views
2

我有一个包含分支ID和分支开始时间和结束时间获取小时2008

BRANCHID SHIFTID  STARTTIME    STOPTIME   
    1    1 1900-01-01 00:01:00.000 1900-01-01 23:58:00.000 
    4    4 1900-01-01 07:30:00.000 1900-01-01 18:00:00.000 
    5    5 1900-01-01 06:30:00.000 1900-01-01 19:00:00.000 
    6    6 1900-01-01 06:30:00.000 1900-01-01 17:00:00.000 
    7    7 1900-01-01 00:30:00.000 1900-01-01 18:00:00.000 

现在我想得到这样的日期范围内的小时数表:

BRANCHID    Hours  
     1    1 
     1    2 
     1    3 
     .    . 
     .    . 

生成的表格包含时间间隔内的分支标识和小时数。像分支1的开始时间是00:01:00 - 23:58:00。比分支号1个间隔时间包含下列时间1,2,3,4,5,6等..

+1

请解释结果和标记使用的是 – TheGameiswar

回答

0

创建临时表#hours。

create table #Hours 
    (
    BId int, 
    [Hour] int 
    ) 

获取最大和最小日期时间。

While (@minDateTime < @maxDateTime) 
begin 
    insert into #Hours values (@brID,Datepart(hour,@minDateTime)) 
    set @minDateTime = DATEADD(hh,1,@minDateTime) 
end 

Select * from #Hours 
1
select 
branchid from table t1 
cross apply 
(
select n from numbers 
where n >=datepart(hour,starttime) and n<=datepart(hour,stoptime) 
) b 

下面是关于使用的号码表中的某些环节..

1. http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/you-require-a-numbers-table.aspx

2. https://dba.stackexchange.com/questions/11506/why-are-numbers-tables-invaluable

+2

切勿在没有你的号码表 – CaptainMarvel

+0

FYI离开家的SQL Server的版本|非常适合一个简单的数字表,你没有CREATE权限:[Generate a number sequence](http://stackoverflow.com/questions/21425546/how-to-generate-a-range-of-numbers-间双号功能于SQL服务器)。只需将'SELECT'语句更改为'SELECT * INTO#numbers'。这对我只有基本权利的合同工作有帮助。 – CaptainMarvel