У меня есть отчет, который вычисляет разницы в нескольких датах (в рабочих днях, а не в DATEDIFF) по разным бизнес-причинам, которые слишком скучны, чтобы в них вмешиваться.
По сути, запрос (прямо сейчас) выглядит примерно так:
SELECT -- some kind of information
DATEDIFF(dd, DateOne, DateTwo) AS d1_d2_diff,
DATEDIFF(dd, DateOne, DateThree) AS d1_d3_diff,
DATEDIFF(dd, DateTwo, DateThree) AS d2_d3_diff,
DATEDIFF(dd, DateTwo, DateFour) AS d2_d4_diff
FROM some_table;
Я мог бы изменить это вычисление, чтобы использовать скалярную функцию, но я не хочу, чтобы скалярная функция выполнялась 4 раза для каждой строки в наборе результатов.
У меня есть таблица календаря в базе данных:
CREATE TABLE Calendar (
Date DATETIME NOT NULL,
IsWeekday BIT,
IsHoliday BIT
);
Будет ли в этом случае хорошим выбором табличная функция и CROSS APPLY? Если так, то как мне написать такую вещь? Или скалярная функция моя лучшая ставка?
Важное примечание Все значения даты в нашей базе данных были удалены из времени, поэтому можно игнорировать любой код, который будет сбрасывать дни до полуночи.