Имя: Пароль:
1C
 
Можно ли посчитать время в запросе?
0 Вася Теркин
 
23.09.14
07:11
Есть периодический РС с периодом секунда
Период  - стандартно
ОсновноеСредство - справочник
Используется - число 1,0 неотрицательный

Уже есть заполняемый регистр
08:21:43 20.09.2014 Станок8    1
09:04:24 20.09.2014 Станок4    1
09:04:26 20.09.2014 Станок8    0
10:43:11 20.09.2014 Станок6    1
21:21:43 20.09.2014 Станок4    0
03:26:31 21.09.2014 Станок8    1
05:03:21 21.09.2014 Станок6    0
07:45:43 21.09.2014 Станок8    0

Как в запросе посчитать время до секунд сколько станки использовались (значение1). Или все таки лучше выбрать записи РС и в ТЗ просуммировать.
Надо получить
Дата
Станок
Втремя
1 Beduin
 
23.09.14
07:13
Функция предназначена для получения разницы между двумя датами.

Первый параметр — вычитаемая дата, выражение типа ДАТА;

Второй параметр — исходная дата, выражение типа ДАТА;

Третий параметр – тип разности, одно из: СЕКУНДА, МИНУТа, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД.
2 Мимохожий Однако
 
23.09.14
07:15
Если это надо постоянно, то заведи регистр накопления.
3 shuhard
 
23.09.14
07:16
(0) при переменном числе записей сделать это можно генерацией текста запроса, но гемор того не стоит
4 Вася Теркин
 
23.09.14
07:24
Хочу просто циклом в ТЗ складывать и записывать, а не в запросе. А потом ТЗ использовать как источник для СКД. Или в запросе тоже можно?
5 Вася Теркин
 
23.09.14
07:25
Просто запрос быстрее выполняется чем обход выборки, но с выборкой легче в десятки раз...
6 ДенисЧ
 
23.09.14
07:49
Оборотный регистр лучше заведи
7 kosts
 
23.09.14
08:57
(5) Ищи на форуме подобные темы, сотни их было.
8 kosts
 
23.09.14
09:01
Вот вроде подходящая тема
forum.infostart.ru/forum26/topic112033/message1160433
9 Вася Теркин
 
23.09.14
09:02
(6) Независимый режим записи невозможен. А там надо независимый.
10 Вася Теркин
 
23.09.14
09:06
Кроме того обходом легче всякие недоразумения убирать. Например начало в один день, а конец на следующем. Или Забыли внести запись о включении. Или о выключении. Там тоже нужны правила по исправлению этой ошибки. В запросе все это будет тяжело. Потом ещё одно-два правила подсчета изменят и придется ползапроса переделывать как всегда.
11 kosts
 
23.09.14
09:08
(10) Все зависит от объемов скорости работы.

>и придется ползапроса переделывать как всегда.
Лично мне проще в запросах ковыряться, чем кодом.
12 Fragster
 
гуру
23.09.14
09:23
ВЫБРАТЬ
    1 КАК Период,
    "А" КАК Станок,
    1 КАК Использование
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5,
    "А",
    0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    10,
    "Б",
    1
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Т1.Период КАК ВремяНачалаИспользования,
    ЕстьNULL(Т2.Период, &ТекДата) КАК ВремяОкончанияИспользования, //текущая дата
    ЕстьNULL(Т2.Период, &ТекДата) - Т1.Период КАК ВремяИспользования, // заменить на разностьДат
    Т1.Станок
ИЗ
    Данные КАК Т1
        ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Т2
        ПО Т1.Станок = Т2.Станок
            И Т1.Использование = 1
            И Т2.Использование = 0
            И Т2.Период В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    Отбор.Период
                ИЗ
                    Данные КАК Отбор
                ГДЕ
                    Отбор.Станок = Т1.Станок
                    И Отбор.Использование = Т1.Использование
                    И Отбор.Период < Т1.Период
                УПОРЯДОЧИТЬ ПО
                    Отбор.Период УБЫВ))
ГДЕ
    Т1.Использование = 1
13 Fragster
 
гуру
23.09.14
09:24
И Отбор.Использование = Т2.Использование
14 Fragster
 
гуру
23.09.14
09:25
И Отбор.Период > Т1.Период
                УПОРЯДОЧИТЬ ПО
                    Отбор.Период
15 Fragster
 
гуру
23.09.14
09:29
еще можно через два этапа - одним получить минимальный период с использованием 0 для каждой записи с использованием 1, а потом соединить. будет быстрее, но не так клево
16 боксер
 
23.09.14
09:32
наду через вытеснение делать как в зуп: работает не работает
17 Вася Теркин
 
08.10.14
10:54
ВЫБРАТЬ
    1 КАК Период,
    "А" КАК Станок,
    1 КАК Использование
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5,
    "А",
    0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    7,
    "А",
    1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    12,
    "А",
    0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    10,
    "Б",
    1
;


Исходные данные будут такие только
18 Вася Теркин
 
08.10.14
10:57
И тут он неправильно считает


А 1  12  11
А 7  12   5
Б 10  ... ...


а надо

А 1   5   4
А 7  12   5
Б 10  ... ...
19 Вася Теркин
 
08.10.14
10:58
Надо брать максимум ближайший ,а не абсолютный из выборки
20 Вася Теркин
 
08.10.14
11:19
Вот так

ВЫБРАТЬ
    1 КАК Период,
    "А" КАК Станок,
    1 КАК Использование
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    12,
    "А",
    0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    7,
    "А",
    1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5,
    "А",
    0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    10,
    "Б",
    1
;



работает если поставить


Отбор.Период ВОЗР
21 Вася Теркин
 
14.10.14
09:32
Неверные параметры "РАЗНОСТЬДАТ"
РАЗНОСТЬДАТ(<<?>>ЕСТЬNULL(Т2.Период, &ТекДата), Т1.Период, ЧАС) КАК ВремяИспользования,
22 Вася Теркин
 
14.10.14
09:32
Причем построителем запроса сформировал и все ок. А не исполняеься.
23 Вася Теркин
 
14.10.14
09:34
А вот тут пишут v8: проверка на null что нет синтаксической ошибки. Как понимать?
24 Ненавижу 1С
 
гуру
14.10.14
09:44
что ты передаешь в &ТекДата?
25 hhhh
 
14.10.14
09:46
(21) надо наоборот

Т1.Период, Т2.Период
26 Вася Теркин
 
14.10.14
09:47
(24) Это был правильный вопрос...
27 Ненавижу 1С
 
гуру
14.10.14
09:47
(25) но ошибка не в этом
28 Вася Теркин
 
14.10.14
09:47
(25) И это тоже.
29 hhhh
 
14.10.14
09:52
если запрос в СКД, тогда "ЧАС"
30 _fmrlex
 
14.10.14
10:20
(0) Группируешь записи по станкам.
Делаешь вычисляемое поле по типу
РазностьДат(Дата,ВычислитьВыражение("Дата",,,"Следующая", "Следующая") , "СЕКУНДА")
Это вычисляет разницу текущей записи и следующей в секундах.
А дальше сам поймешь.
31 _fmrlex
 
14.10.14
10:22
+(30) Вернее разницу следующей и текущей