Разделите текущую дату на часовые интервалы и получите счет производства - PullRequest
0 голосов
/ 30 сентября 2019

Как я могу разделить текущую дату на часовые интервалы, такие как 00:00 - 01:00, для 24 часов, и на основании этого мне нужно получить счет продукции, который является другим столбцом.

Это код столбца даты и столбца подсчета, который я хотел сгруппировать по часовому интервалу.

select count(*),order_start_time_T
from UDA_Order UDA INNER JOIN WORK_Order WO ON WO.order_key = UDA.object_key
where order_state = 'BOOKED' OR order_state = 'CLOSED'
GROUP BY order_start_time_T

это возвращает меня

Count   order_start_time_T
2   2019-07-02 10:54:27.000
7   2019-07-02 10:55:27.000
1   2019-07-02 11:51:58.000
1   2019-07-02 11:58:41.000
1   2019-07-02 12:19:13.000

ожидаемый результат

Count   Hour interval till 24 hours for current day
2   00:00 - 01:00
7   01:00 - 02:00
1   02:00 - 03:00
1   03:00 - 04:00
1   04:00 - 05:00
1   05:00 - 06:00

и т. д. до 24 часов текущего дня.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Я бы попробовал использовать вспомогательную таблицу, которая будет содержать начальный час (столбец h1) и конечный час (столбец h2). Я использовал временную таблицу, но это может быть стандартная таблица или переменная таблицы. Отображение столбцов предназначено только для отображения.

Во-первых, я заполняю таблицу начальным и конечным часами, начиная с 0. Во-вторых, я использую DATEPART для определения часа заказа (order_start_time_T) и проверяю, вот какого периода зависит этот час.

h1   h2    display
---  ---   ---
0    1     00:00 - 01:00
1    2     01:00 - 02:00
....   
23   24    23:00 - 24:00

Запрос:

-- Populate time table
   if object_id('tempdb..#t') is not null drop table #t
create table #t (
    h1 tinyint,
    h2 tinyint,
    display varchar(30)
);

declare @i tinyint =0
while @i<24 begin
    insert into #t (h1, h2, display) values(@i, @i+1
        , case when @i<10 then '0' else '' end+cast(@i as varchar)
            +':00 - ' + case when @i<9 then '0' else '' end+ cast(@i+1 as varchar)+':00')
    set @i = @i + 1
end


-- Group per period
select count(*) [Count], t.display
from UDA_Order UDA INNER JOIN WORK_Order WO ON WO.order_key = UDA.object_key
JOIN #t t ON datepart(hour, order_start_time_T) between t.h1 and t.h2
where order_state = 'BOOKED' OR order_state = 'CLOSED'
GROUP BY t.display
0 голосов
/ 30 сентября 2019

Вам нужно использовать функцию DATEPART, которая возвращает часть необходимой вам даты, которая в вашем случае - hrs.

select count(*), CAST(order_start_time_T AS DATE) StartDate, DATEPART(HOUR, order_start_time_T) StartHr
from UDA_Order UDA INNER JOIN WORK_Order WO ON WO.order_key = UDA.object_key
where order_state = 'BOOKED' OR order_state = 'CLOSED'
GROUP BY CAST(order_start_time_T AS DATE), DATEPART(HOUR, order_start_time_T)

Но это не вернет результаты, как вы хотите. Это вернет это так (например):

Count   StartDate   StartHr 
2   2019-07-02 10
7   2019-07-02 11
1   2019-07-02 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...