powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хитрый запрос
3 сообщений из 3, страница 1 из 1
Хитрый запрос
    #32030903
Максим
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
У меня возникла проблема с выборкой данных для отчета.
Есть три поля hardware_id(Agr1, Agr2, Agr3, ...), dtime (2002/05/22 15:48:29),action_id (st1(старт),st0(стоп)).
К примеру для отчета выбираю интервал работы оборудования за 8 часов. Если оборудование не закончило работу за этот интервал времени, то эту проблему я решил.
У меня проблема в другом - если оборудование начало работу до запрашиваемого интервалаб то каким образом мне можно расчитать время его работы не от его старта, а только в этом интервале времени??
Заранее всем благодарен.
...
Рейтинг: 0 / 0
Хитрый запрос
    #32030967
Фотография Белов Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом интервале времени - в каком, честно говоря, не понятно
...
Рейтинг: 0 / 0
Хитрый запрос
    #32030969
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного упростил, чтобы не возиться со временем, сделал учет в кол-ве дней. Скрипт примера:


-- таблица, где есть id, код обьекта, дата запуска/останова, флаг (1-запущен, 0-остановлен)
declare @Table table (Id int not null identity primary key, Object_id int not null, WorkDate smalldatetime not null, Flag tinyint not null)

-- 1 Обьект, работал с 1 по 5
insert into @Table (Object_id, WorkDate, Flag) Values (1, '20020101', 1)
insert into @Table (Object_id, WorkDate, Flag) Values (1, '20020105', 0)

-- 2 Обьект, работал с 10 по 20
insert into @Table (Object_id, WorkDate, Flag) Values (2, '20020110', 1)
insert into @Table (Object_id, WorkDate, Flag) Values (2, '20020120', 0)

-- 3 Обьект, работал с 20, работу не закончил
insert into @Table (Object_id, WorkDate, Flag) Values (3, '20020120', 1)

-- Установим промежуток выбора с 3 по 15
declare @BeginDate smalldatetime, @EndDate smalldatetime
set @BeginDate = '20020103'
set @EndDate = '20020115'

-- Сам запрос, возвращающий Обьект, Дату запуска, Дату остановки, Кол-во работающих дней в заданном интервале
select Object_id, BeginDate, EndDate,
-- Получаем разницу между датами, сравнивая начальную и конечную и срезая их до нужного периода
DateDiff(dd,
case when BeginDate < @BeginDate then @BeginDate else BeginDate end,
case when EndDate > @EndDate then @EndDate else EndDate end) as CountDay
from
-- Подзапрос, преобразовывающих таблицу к формату Обьект, ДатаЗапуска, ДатаОстановки
(select b.Object_id, b.WorkDate as BeginDate, IsNull(Min(e.WorkDate), @EndDate) as EndDate
from @Table b
left join @Table e on b.Object_id = e.Object_id and
b.WorkDate <= e.WorkDate and
e.Flag = 0 and
e.WorkDate >= @BeginDate
where b.Flag = 1 and b.WorkDate <= @EndDate
group by b.Object_id, b.WorkDate) as p


Вроде как работает. Далее можно сей запрос адаптировать под ваши нужды
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хитрый запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]