Разница между датами в запросе

Опубликовал Trakt0risT Trakt0risT (Trakt0risT) в раздел Программирование - Практика программирования

Получение разницы между датами в запросе формата: "Дней; часов; минут"
ПРАВИЛЬНЫЙ КОД (ОТ i132) ОБРАБОТКУ ИСПРАВИЛ!!!

Ситуация следующая: Возникла необходимость получения времени отработки поручения.
В списке (1С 8.2 управляемые формы) документа есть 2 даты дата создания документа и дата его закрытия надо выводить в список разность между датами в формате (дн. час. мин.)
Думал все просто и банально, но не тут то было это все норм делается если у тебя 8.1 например. А здесь (8.2) динамический список который строится из запроса.
Вообще помучался я и решил править запрос…. Понял что всё гораздо хуже чем я это себе представлял и не найдя другого выхода / решения данной проблемы на просторах интернета, я сделал ЭТО: РазностьДатВЗапросе.epf (Хотел выложить код, но надо покупать обработку "разукрашку", вообщем кому надо будет пишите в личку я обязательно вышлю!)

PS: строго не судите первая публикация

PSS: о пользе данного запроса сужу по сообщениям в интернете … были люди которым это реально было нужно, но им давали глупые ответы… типо РАЗНОСТЬДАТ(,,Час) и т.д.

 

ВОТ ЭТО ПРАВИЛЬНЫЙ КОД (ОТ i132) ОБРАБОТКУ ИСПРАВИЛ!!!

   

    Запрос = Новый Запрос;
   
Запрос.Текст =
       
"ВЫБРАТЬ
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе
        |ПОМЕСТИТЬ ВремяВсе
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВЫБОР
        |       КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, ДЕНЬ, ВремяВсе.ДниВсе) > &ДатаК
        |           ТОГДА ВремяВсе.ДниВсе - 1
        |       ИНАЧЕ ВремяВсе.ДниВсе
        |   КОНЕЦ КАК ДниВсе,
        |   ВЫБОР
        |       КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, ЧАС, ВремяВсе.ЧасыВсе) > &ДатаК
        |           ТОГДА ВремяВсе.ЧасыВсе - 1
        |       ИНАЧЕ ВремяВсе.ЧасыВсе
        |   КОНЕЦ КАК ЧасыВсе,
        |   ВЫБОР
        |       КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, МИНУТА, ВремяВсе.МинутыВсе) > &ДатаК
        |           ТОГДА ВремяВсе.МинутыВсе - 1
        |       ИНАЧЕ ВремяВсе.МинутыВсе
        |   КОНЕЦ КАК МинутыВсе,
        |   ВремяВсе.СекундыВсе
        |ПОМЕСТИТЬ ВремяКор
        |ИЗ
        |   ВремяВсе КАК ВремяВсе
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВремяКор.ДниВсе КАК Дни,
        |   ВремяКор.ЧасыВсе - ВремяКор.ДниВсе * 24 КАК Часы,
        |   ВремяКор.МинутыВсе - ВремяКор.ЧасыВсе * 60 КАК Минуты,
        |   ВремяКор.СекундыВсе - ВремяКор.МинутыВсе * 60 КАК Секунды
        |ИЗ
        |   ВремяКор КАК ВремяКор"
;

   
Запрос.УстановитьПараметр("ДатаН",Объект.ДатаН);
   
Запрос.УстановитьПараметр("ДатаК",Объект.ДатаК);

   
Результат = Запрос.Выполнить();
   
ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Если
ВыборкаДетальныеЗаписи.Следующий() тогда
       
Сообщить(""+ВыборкаДетальныеЗаписи.Дни+" "+ВыборкаДетальныеЗаписи.Часы+" "+ВыборкаДетальныеЗаписи.Минуты+" "+ВыборкаДетальныеЗаписи.Секунды+" ");
    КонецЕсли;;

Скачать файлы

Наименование Файл Версия Размер
РазностьДатВЗапросе.epf
.epf 6,45Kb
07.12.11
53
.epf 6,45Kb 53 Скачать

См. также

Добавить вознаграждение
Комментарии
1. ediks (ediks) 319 06.12.11 11:21 Сейчас в теме
А не покупайте "разукрашку" - возьмите с диска ИТС аналогичную. :D
2. Trakt0risT Trakt0risT (Trakt0risT) 96 06.12.11 11:29 Сейчас в теме
Понял... щас поищу, отредактирую!
3. Сергей Рудаков (fishca) 1034 06.12.11 12:06 Сейчас в теме
да и скриншот запроса из конфигуратора еще никто не отменял :)
4. Trakt0risT Trakt0risT (Trakt0risT) 96 06.12.11 13:10 Сейчас в теме
Получилось) А скрином запрос большой )))
Ну вот так нормально должно быть.
5. Илья (i132) 112 06.12.11 13:34 Сейчас в теме
можно сделать проще:

ВЫБРАТЬ
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе
ПОМЕСТИТЬ ВремяВсе
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
ВремяВсе.ДниВсе как Дни,
ВремяВсе.ЧасыВсе-ВремяВсе.ДниВсе*24 как Часы,
ВремяВсе.МинутыВсе-ВремяВсе.ЧасыВсе*60 как Минуты,
ВремяВсе.СекундыВсе-ВремяВсе.МинутыВсе*60 как Секунды
ИЗ
ВремяВсе КАК ВремяВсе
6. Trakt0risT Trakt0risT (Trakt0risT) 96 06.12.11 14:05 Сейчас в теме
(5) i132, Выполнил Ваш код, но ничего не вышло объясню почему наглядно!!! (я пробовал очень много вариантов!)
Прикрепленные файлы:
7. Илья (i132) 112 06.12.11 16:03 Сейчас в теме
(6) ой извините не проверил переход 23:59:59 - 00:00:01 вот исправленный запрос:

ВЫБРАТЬ
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе
ПОМЕСТИТЬ ВремяВсе
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Выбор Когда ДобавитьКДате(&ДатаН,День,ВремяВсе.ДниВсе)>&ДатаК Тогда ДниВсе-1
Иначе ВремяВсе.ДниВсе Конец Как ДниВсе,
Выбор Когда ДобавитьКДате(&ДатаН,Час,ВремяВсе.ЧасыВсе)>&ДатаК Тогда ЧасыВсе-1
Иначе ВремяВсе.ЧасыВсе Конец Как ЧасыВсе,
Выбор Когда ДобавитьКДате(&ДатаН,МИНУТА,ВремяВсе.МинутыВсе)>&ДатаК Тогда МинутыВсе-1
Иначе ВремяВсе.МинутыВсе Конец Как МинутыВсе,
ВремяВсе.СекундыВсе
ПОМЕСТИТЬ ВремяКор
ИЗ
ВремяВсе
;
////////////////////////////////////////////////////////////­////////////////////
Выбрать
ВремяКор.ДниВсе как Дни,
ВремяКор.ЧасыВсе-ВремяКор.ДниВсе*24 как Часы,
ВремяКор.МинутыВсе-ВремяКор.ЧасыВсе*60 как Минуты,
ВремяКор.СекундыВсе-ВремяКор.МинутыВсе*60 как Секунды
ИЗ
ВремяКор

РS маленькая хитрость: если полсе слов Запрос.Текст=встать на начало следущей строки - конструктор поместит запрос с этой позициии -без большого отступа.
ValeraEm; Trakt0risT; V_V_V; +3 Ответить 3
8. Сергей Рудаков (fishca) 1034 06.12.11 16:12 Сейчас в теме
(4) рука потянулась к минусу, быстрее исправляй запрос чтобы выглядел по человечески
9. VVV Vit (V_V_V) 06.12.11 16:27 Сейчас в теме
(7) Разницу дат победил легко. А теперь прекращаем заниматься фигней и оптимизируем запросы в УТП... :)
10. Trakt0risT Trakt0risT (Trakt0risT) 96 06.12.11 17:47 Сейчас в теме
(7) i132, Это реально круто! Молодец.

Я конечно завтра проверю! ))
11. Trakt0risT Trakt0risT (Trakt0risT) 96 07.12.11 07:19 Сейчас в теме
(7) i132, Запрос супер, проверил все работает!

Обработку исправил! публикацию тоже!
12. Trakt0risT Trakt0risT (Trakt0risT) 96 07.12.11 09:26 Сейчас в теме
Одно обидно я так и не смог применить Код i132.
Потому что запрос динамического списка не поддерживает вложенные таблицы... и мне пришлось вернуться к моему первому варианту ( обидно.
13. Илья (i132) 112 07.12.11 11:37 Сейчас в теме
12. опять поймали на ощибке -пришлось проверить как работает динамический список - вложенные таблицы он как раз поддерживает (проверил на фаловом варианте) -то что не поддерживает пакетные запросы не обратил внимание.
Сразу была мысль что можно было делать вложеннымит запросами - но тогда получается не так красиво.

Такой запрос работает в динамическом списке (проверил):
ВЫБРАТЬ
ВремяКор.МинутыВсе КАК Минуты,
ВремяКор.СекундыВсе - ВремяКор.МинутыВсе * 60 КАК Секунды
ИЗ (ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, МИНУТА, ВремяВсе.МинутыВсе) > &ДатаК
ТОГДА ВремяВсе.МинутыВсе - 1
ИНАЧЕ ВремяВсе.МинутыВсе
КОНЕЦ КАК МинутыВсе,
ВремяВсе.СекундыВсе КАК СекундыВсе
ИЗ (ВЫБРАТЬ
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе
) КАК ВремяВсе
) КАК ВремяКор
Trakt0risT; +1 Ответить 1
14. Trakt0risT Trakt0risT (Trakt0risT) 96 07.12.11 11:42 Сейчас в теме
(13) i132, М-да теперь точно не поспоришь! ))) Работает...Супер ) Спасибо большое ... всё грамотно.

PS: Перепутал пакетный с вложенными ;)
15. Алекс Ю (AlexO) 113 08.12.11 01:15 Сейчас в теме
Автор, так а чем РАЗНОСТЬДАТ не устроила? получил и пересчитал ))
Получается, обработка не к документу - а вручную даты вставлять?
16. Trakt0risT Trakt0risT (Trakt0risT) 96 08.12.11 06:10 Сейчас в теме
(15) AlexO, Ту немного сложнее РАЗНОСТЬДАТ выдает данные в ВСЕГОСекундах, ВсегоМинут и т.д. Тоесть есть секунд может быть очень много, а не 60 как должно быть. Попробуй ).
Это обработка для демонстрации кода, тоесть теперь кидаешь в неё любой документ и вместо ДатаН и ДатаК подставляешь любые даты из документа.
Делалось для динамического списка 8.2
17. Trakt0risT Trakt0risT (Trakt0risT) 96 08.12.11 14:59 Сейчас в теме
Вопрос в продолжение извращения:
Как в запросе объединить колонки в одну???
Ну тоесть: Есть колонка Дни 6 есть часы 20 есть минуты 13, как сделать одну колонку "6 дн. 20 ч. 13 м."

Так и не смог победить!

НУ или резонный вопрос можно ли объединить в списке (динамическом) Несколько колонок в одну!
18. vladal (Vladal) 08.12.11 16:50 Сейчас в теме
Боян.

У меня валялась чья-то обработка, с елочкой на форме и показывающая время до нового года..
Сделана одним простым запросом, без временных таблиц.
19. Илья (i132) 112 08.12.11 17:29 Сейчас в теме
(17) не знаю - не получается... :-/
зато запрос можно написать проще ;-)

ВЫБРАТЬ
ДЕНЬГода(СмещеннаяДата)-1+(Год(СмещеннаяДата)-1)*365 как Дни,
Час(СмещеннаяДата) как Часы,
Минута(СмещеннаяДата) как Минуты,
Секунда(СмещеннаяДата) как Секунды
Из (Выбрать
ДобавитьКДате(ДАТАВРЕМЯ(1,1,1),СЕКУНДА,РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА)) Как СмещеннаяДата
) как Подзапрос

Если надо измените запрос на случай больше 4х лет, с учетом висосоксных лет.
Tpakmop; Trakt0risT; +2 Ответить 2
20. Алекс Ю (AlexO) 113 08.12.11 23:02 Сейчас в теме
(19) i132,
ага, т.е. следующий високосный год не учтен? ;)
21. Андрей Д. (detec) 122 12.12.11 13:53 Сейчас в теме
Было бы замечательно, если в запросе отображалась бы ещё разница в годах, месяцах и днях.
22. 1 (shomo) 14.12.11 14:08 Сейчас в теме
Да с высокосными годами какая-то проблема.... хотя все правильно и система должна была самостоятельно это отработать...
23. Илья (i132) 112 14.12.11 17:49 Сейчас в теме
(22) в чем проблема с високосными годами? - в запросе (19) надо учитывать что в 0004 году 366 дней.

(17) (число=>Строка) можно извращаться как http://kb.mista.ru/article.php?id=666.
разницу времени можно пердставить как "1:01:01" -Вывести колонку запроса(19) СмещеннаяДата с форматом время("ДЛФ=T")
еще вариант время 2ч 13минут преобразовать в число 213.00 (ч*100+м*1+с*0.01) и Вывести с форматом (ЧДЦ=2; ЧРД=м; ЧРГ=ч; ЧГ=2) => получится 2ч13м00
24. Илья (i132) 112 20.12.11 10:25 Сейчас в теме
Еще варант преобразования в запросе числа в строку: http://forum.mista.ru/topic.php?id=388253#23

ЧислоСтрокой = "00";
Для N = 0 По 99 Цикл
ЧислоСтрокой = ЧислоСтрокой + Формат(N,"ЧЦ=2; ЧВН=");
КонецЦикла;

|""20"" + ПОДСТРОКА(&ЧислоСтрокой, (ГОД(&ТекДата) - 2000) * 2 + 1, 2)
|+ ""/"" + ПОДСТРОКА(&ЧислоСтрокой, МЕСЯЦ(&ТекДата) * 2 + 1, 2)
| + ""/"" + ПОДСТРОКА(&ЧислоСтрокой, ДЕНЬ(&ТекДата) * 2 + 1, 2) КАК ДатаСтрокой,
Trakt0risT; +1 Ответить
25. Trakt0risT Trakt0risT (Trakt0risT) 96 20.12.11 11:17 Сейчас в теме
Полезный код возьму на заметку. ))