|
|
|
Хитрый запрос
|
|||
|---|---|---|---|
|
#18+
Всем привет! У меня возникла проблема с выборкой данных для отчета. Есть три поля hardware_id(Agr1, Agr2, Agr3, ...), dtime (2002/05/22 15:48:29),action_id (st1(старт),st0(стоп)). К примеру для отчета выбираю интервал работы оборудования за 8 часов. Если оборудование не закончило работу за этот интервал времени, то эту проблему я решил. У меня проблема в другом - если оборудование начало работу до запрашиваемого интервалаб то каким образом мне можно расчитать время его работы не от его старта, а только в этом интервале времени?? Заранее всем благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2002, 08:42 |
|
||
|
Хитрый запрос
|
|||
|---|---|---|---|
|
#18+
В этом интервале времени - в каком, честно говоря, не понятно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2002, 12:23 |
|
||
|
Хитрый запрос
|
|||
|---|---|---|---|
|
#18+
Немного упростил, чтобы не возиться со временем, сделал учет в кол-ве дней. Скрипт примера: -- таблица, где есть 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 Вроде как работает. Далее можно сей запрос адаптировать под ваши нужды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2002, 12:35 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32030969&tid=1822643]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
183ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 475ms |

| 0 / 0 |
