Запрос, который преобразует время начала и время окончания в почасовые записи - PullRequest
0 голосов
/ 28 декабря 2018

В таблице указано, где каждая запись является уникальным событием.Каждая запись имеет время начала и время окончания.Каждое событие представляет число человеко-часов в журнале.

Я хочу создать запрос, который дублирует каждую запись один раз для каждого часа дня, который он охватывает, и связывает дублирующую запись с часом дня, который он представляет.Я также хочу, чтобы первичный ключ повторялся с дублирующимися записями.

Время начала и окончания - это даты и время.

У меня есть только доступ на чтение, что сильно ограничивает меня.

Например, как у меня выглядит:

pk   StartTime           EndTime

1     Start date 1am   End date 3am

Что я хочу:

pk   HourOfDay 

1     1 am
1     2 am

Я хочу это для всех записей в таблице в результате одного запроса.

Цель состоит в том, чтобы определить истинный самый загруженный час дня и определить дни, когда спрос на услуги был выше, чем численность персонала.

То, что я пробовал с тех пор, как Дейл Баррелл ответил превосходно, этоприсоединение табличной переменной рекомендованным способом, но у меня возникают трудности с условным соединением.

Я пытался после создания табличных переменных, как это предлагается в решении 1 ниже, я попытался выполнить следующее условноеприсоединяйтесь и продолжайте получать синтаксические ошибки:

select
  T.id
  ,H.[Hour]
from
  @TimeSheet as T
  inner join @Hour as H on 
    case
        when datepart(hour, StartTime) < datepart(hour, EndTime)
        then H.[Hour] >= datepart(hour, T.StartTime) 
             and H.hour < datepart(hour, T.EndTime)

        when datepart(hour, StartTime) > datepart(hour, EndTime)
        then H.[Hour] <= datepart(hour, T.StartTime) 
             and H.hour > datepart(hour, T.EndTime)

        else datepart(hour, StartTime) = H.[Hour]
     end





sample data for case 1, start hour > end hour

pk   start                   end
1    '2018-01-01 01:00:000'  '2018-01-01 02:00:00


sample data for case 2, start hour < end hour

pk   start                   end
1    '2018-01-01 22:00:000'  '2018-01-02 01:00:00

sample data for case 3, start hour = end hour

pk   start                   end
1    '2018-01-01 01:00:000'  '2018-01-01 01:30:00

1 Ответ

0 голосов
/ 28 декабря 2018

Следующее дает что-то вроде того, что вы ищете.Я оставил для вас крайние дела, особенно полночный: :)

declare @Hour table ([Hour] int)
declare @TimeSheet table (id int, StartTime time, EndTime time)

insert into @Hour ([Hour])
  select 0
  union all select 1
  union all select 2
  union all select 3
  union all select 4
  union all select 5
  union all select 6
  union all select 7
  union all select 8
  union all select 9
  union all select 10
  union all select 11

insert into @TimeSheet (id, StartTime, EndTime)
  select 1, '01:00', '03:00'

select T.id, H.[Hour]
from @TimeSheet T
inner join @Hour H on H.[Hour] >= datepart(hour, T.StartTime) and H.[Hour] < datepart(hour, T.EndTime)
...