2016-09-26 3 views
2

У меня есть таблица, содержащая филиальную идентификатор и ветви StartTime и время окончанияПолучить час от сервера SQL диапазон даты и времени 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

пожалуйста, объясните результат и помечать версию сервера SQL вы используете – 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 | Отлично подходит для таблицы простых чисел, где у вас нет разрешений 'CREATE': [Создать последовательность чисел] (http://stackoverflow.com/questions/21425546/how-to-generate-a-range-of-numbers- между-два-числа-в-SQL-сервер). Просто измените оператор SELECT на 'SELECT * INTO # numbers'. Это помогло на контрактных работах, где у меня были только основные права. – CaptainMarvel

Смежные вопросы