К основному контенту

Запросы.РАЗНОСТЬДАТ(СЕКУНДА) и MS SQL. Ошибка HResult 80040E57



Столкнулся сегодня с ошибкой выполнения запроса в котором применяется функция РАЗНОСТЬДАТ(Дата1,Дата2,СЕКУНДА). Ошибка воспроизводится в Клиент-Серверном варианте, где в качестве СУБД семейства MS SQL Server






HResult 80040E57 "difference of two datetime columns caused overflow at runtime"

Причина в ограничении использования DateDiff (результат перевода Языка запросов 1С в T-SQL)



DATEDIFF produces an error if the result is out of range for integer values. For milliseconds, the maximum number is 24 days, 20 hours, 31 minutes and 23.647 seconds. For seconds, the maximum number is 68 years. https://msdn.microsoft.com/

UPD: ошибка справедлива и для файлового варианта информационной базы.

UPD 2: ошибка справедлива и для Вычисляемых полей СКД

Суть решения - проверить разность дат, и если разность дат больше 68 лет - рассчитать число секунд "в ручную".

Количество секунд от первых суток периода + количество "полных" дней в периоде * количество секунд в сутках (60*60*24) + количество суток в последних сутках периода

ВЫБРАТЬ
 Периоды.ДатаНачала,
 Периоды.ДатаОкончания,
 Периоды.РазностьДатСекунд КАК ДолжноБыть,
 ВЫБОР
  КОГДА РАЗНОСТЬДАТ(Периоды.ДатаНачала, Периоды.ДатаОкончания, ГОД) > 67
   ТОГДА РАЗНОСТЬДАТ(Периоды.ДатаНачала, КОНЕЦПЕРИОДА(Периоды.ДатаНачала, ДЕНЬ), СЕКУНДА) + 1 + РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(Периоды.ДатаНачала, ДЕНЬ), СЕКУНДА, 1), НАЧАЛОПЕРИОДА(Периоды.ДатаОкончания, ДЕНЬ), ДЕНЬ) * 86400 + РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Периоды.ДатаОкончания, ДЕНЬ), Периоды.ДатаОкончания, СЕКУНДА)
  ИНАЧЕ РАЗНОСТЬДАТ(Периоды.ДатаНачала, Периоды.ДатаОкончания, СЕКУНДА)
 КОНЕЦ КАК Результат,
 Периоды.Комментарий
ИЗ
 (ВЫБРАТЬ
  ДАТАВРЕМЯ(1900, 1, 1, 0, 0, 0) КАК ДатаНачала,
  ДАТАВРЕМЯ(1968, 1, 20, 3, 14, 7) КАК ДатаОкончания,
  РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1900, 1, 1, 0, 0, 0), ДАТАВРЕМЯ(1968, 1, 20, 3, 14, 7), СЕКУНДА) КАК РазностьДатСекунд,
  ВЫРАЗИТЬ("Максимальная разница для РАЗНОСТЬДАТ(СЕКУНДА)" КАК СТРОКА(100)) КАК Комментарий
 
 ОБЪЕДИНИТЬ ВСЕ
 
 ВЫБРАТЬ
  ДАТАВРЕМЯ(1900, 1, 1, 0, 0, 0),
  ДАТАВРЕМЯ(1968, 1, 20, 3, 14, 8),
  2147483648,
  "Для РАЗНОСТЬДАТ(СЕКУНДА) - Критичная 1 секунда"
 
 ОБЪЕДИНИТЬ ВСЕ
 
 ВЫБРАТЬ
  ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1900, 1, 1, 0, 0, 0), СЕКУНДА, -&ОтнятьСекундТест),
  ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1900, 1, 1, 0, 0, 0), СЕКУНДА, &ДобавитьСекундТест),
  &ДобавитьСекундТест + &ОтнятьСекундТест,
  "Произвольный тест для параметров ДобавитьСекундТест и ОтнятьСекундТест") КАК Периоды






Комментарии

Популярные сообщения из этого блога

СписокВыбора. Показать Представление вместо Значения

Вводная Если на форме есть элемент управления со списком выбора, в моем конкретном примере это Колонка Значение (Число (3,0)) с настроенным списком выбора. По умолчанию платформа отображает именно строковое значения, а не текст представления  из списка выбора (когда как при выборе значения из списка показываются именно представления). Решение Для Управляемых форм необходимо настроить правила условного оформления, для обычных форм - оформление ячеек при выводе данных.

Табличный Документ. Разная ширина колонки в строках

Когда нужно в макете (табличном документе) изменить ширину колонки  для конкретных строк: 1. Выделить всю строку (строки). Именно всю, фокус для выделенной области не работает. 2. Нажимаем и не отпускает Ctrl 3. С помощью мыши изменяют ширину любой из колонок - будет задан вопрос об создании нового формата строк - соглашаемся. Как же прекрасен мир, где для модификаций не достаточно просто использовать контекстное меню и диалог редактора свойств, где нужно знать заветные слова и таинства танца. 90ые, моё почтение. UPD Программно, тоже самое, можно сделать через ТабДок = Новый ТабличныйДокумент(); ТабДок.Область(1,,1,).СоздатьФорматСтрок(); ТабДок.Область(1,1).ШиринаКолонок = 70; ТабДок.Область(1,2).ШиринаКолонок = 30; ТабДок.Область(2,,2,).СоздатьФорматСтрок(); ТабДок.Область(2,1).ШиринаКолонок = 30; ТабДок.Область(2,2).ШиринаКолонок = 70; ТабДок.Показать();

Расширение конфигурации + Связанные документы (Режим совместимости 8.3.12)

Вводная: реализовать ввод Заказа поставщику на основании Заказа на Ремонт. решить через расширения конфигурации. Хочу обратить ваше внимание, не нужно добавлять в расширение критерий отбора, для 8.3.12 нам не доступно добавление\изменение состава критерия. Более того может зависать конфигуратор (столкнулся с последней версией 8.3.14 + ERP) Разработку рекомендую вести с применением хранилища и для расширения. Иначе устанете потом выгребать чего лишнего включили в расширение при добавлении таких или схожих обектов с составными типами и подобное. Все текущие типовые решения сейчас идут в режиме совместимости 8.3.12, в прочем и для 8.3.14 (и даже 8.3.15 ничего не поменялось). Что нам нужно было бы сделать при отказе от поддержки: 1) добавить наш документ в Критерий отбора (состав, реквизиты); 2) в раздел Ввод на основании целевого документа. И что с целью сохранения поддержки. Как сделать это же для расширения: 1) Добавить реквизит расширения Документы.ЗаказПоставщику._За