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

07.12.11

Разработка - Запросы

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
РазностьДатВЗапросе.epf
.epf 6,45Kb
54
54 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

 

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

   

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

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

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

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

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184754    1029    403    

968

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2203    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5735    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13143    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8221    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3193    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10804    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ediks 338 06.12.11 11:21 Сейчас в теме
А не покупайте "разукрашку" - возьмите с диска ИТС аналогичную. :D
2. Trakt0risT 111 06.12.11 11:29 Сейчас в теме
Понял... щас поищу, отредактирую!
3. fishca 1260 06.12.11 12:06 Сейчас в теме
да и скриншот запроса из конфигуратора еще никто не отменял :)
4. Trakt0risT 111 06.12.11 13:10 Сейчас в теме
Получилось) А скрином запрос большой )))
Ну вот так нормально должно быть.
8. fishca 1260 06.12.11 16:12 Сейчас в теме
(4) рука потянулась к минусу, быстрее исправляй запрос чтобы выглядел по человечески
user717534; +1 Ответить
5. i132 123 06.12.11 13:34 Сейчас в теме
можно сделать проще:

ВЫБРАТЬ
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе
ПОМЕСТИТЬ ВремяВсе
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
ВремяВсе.ДниВсе как Дни,
ВремяВсе.ЧасыВсе-ВремяВсе.ДниВсе*24 как Часы,
ВремяВсе.МинутыВсе-ВремяВсе.ЧасыВсе*60 как Минуты,
ВремяВсе.СекундыВсе-ВремяВсе.МинутыВсе*60 как Секунды
ИЗ
ВремяВсе КАК ВремяВсе
6. Trakt0risT 111 06.12.11 14:05 Сейчас в теме
(5) i132, Выполнил Ваш код, но ничего не вышло объясню почему наглядно!!! (я пробовал очень много вариантов!)
Прикрепленные файлы:
7. i132 123 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 Ответить
9. V_V_V 06.12.11 16:27 Сейчас в теме
(7) Разницу дат победил легко. А теперь прекращаем заниматься фигней и оптимизируем запросы в УТП... :)
10. Trakt0risT 111 06.12.11 17:47 Сейчас в теме
(7) i132, Это реально круто! Молодец.

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

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

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

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

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

НУ или резонный вопрос можно ли объединить в списке (динамическом) Несколько колонок в одну!
19. i132 123 08.12.11 17:29 Сейчас в теме
(17) не знаю - не получается... :-/
зато запрос можно написать проще ;-)

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

Если надо измените запрос на случай больше 4х лет, с учетом висосоксных лет.
Tpakmop; Trakt0risT; +2 Ответить
20. AlexO 136 08.12.11 23:02 Сейчас в теме
(19) i132,
ага, т.е. следующий високосный год не учтен? ;)
18. v.l. 437 08.12.11 16:50 Сейчас в теме
Боян.

У меня валялась чья-то обработка, с елочкой на форме и показывающая время до нового года..
Сделана одним простым запросом, без временных таблиц.
21. detec 136 12.12.11 13:53 Сейчас в теме
Было бы замечательно, если в запросе отображалась бы ещё разница в годах, месяцах и днях.
22. shomo 14.12.11 14:08 Сейчас в теме
Да с высокосными годами какая-то проблема.... хотя все правильно и система должна была самостоятельно это отработать...
23. i132 123 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 123 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 111 20.12.11 11:17 Сейчас в теме
Полезный код возьму на заметку. ))
Оставьте свое сообщение