Столкнулся сегодня с ошибкой выполнения запроса в котором применяется функция РАЗНОСТЬДАТ(Дата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: ошибка справедлива и для Вычисляемых полей СКД
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), СЕКУНДА, &ДобавитьСекундТест), &ДобавитьСекундТест + &ОтнятьСекундТест, "Произвольный тест для параметров ДобавитьСекундТест и ОтнятьСекундТест") КАК Периоды
Комментарии
Отправить комментарий