С точки зрения производительности, у вас есть версия, на которой оптимизатор будет работать лучше всего.
Если «внешняя» часть вашего примера является статической, а обслуживание кода переопределяет производительность, я хотел бы инкапсулировать результат dateadd в табличную функцию (TVF). Поскольку преобразование времени является очень распространенным потоком в этих запросах, я бы определенно сосредоточился на этой части рабочей нагрузки.
Например, ваш запрос, который может отличаться, будет выглядеть так:
select timeGMT, dataCol2, dataCol3, lt.timeLocal
from tbl1 t1
join tbl2 t2 on t1.ID = t2.ID
cross apply dbo.LocalTimeGet(timeGMT, 'US-Eastern') AS lt
Где TVF dbo.LocalTimeGet содержит логику для dateadd (ss, d.gmtOffset, t.timeGMT) и поиск значения смещения часового пояса на основе имени часового пояса. Реализация этой функции будет выглядеть примерно так:
CREATE FUNCTION dbo.LocalTimeGet (
@TimeGMT datetime,
@TimeZone varchar(20)
)
RETURNS TABLE
AS
RETURN (
SELECT DATEADD(ss, d.gmtOffset, @TimeGMT) AS timeLocal
FROM dst AS d
WHERE d.zone = @TimeZone
);
GO
Достоинством этого подхода является то, что при обновлении до 2008 или более поздней версии есть системные функции, которые вы могли бы использовать, чтобы сделать это преобразование намного проще для кодирования, и вам нужно будет только изменить TVF. Если ваши наборы результатов невелики, я бы рассмотрел системную скалярную функцию (SQL 2008) поверх TVF, даже если она реализует те же системные функции. Исходя из вашего комментария, похоже, что системные функции не будут делать то, что вам нужно, но вы все равно можете придерживаться своей реализации таблицы dst, которая инкапсулирована в TVF выше.
TVF могут вызывать проблемы с производительностью, поскольку оптимизатор предполагает, что они возвращают только 1 строку.
Если вам нужно объединить инкапсуляцию и производительность, я бы вместо этого вычислил часовой пояс в коде приложения. Несмотря на то, что вам придется применять его к каждому проекту, который его использует, вам нужно будет только реализовать его 1 раз в каждом проекте (на уровне доступа к данным) и рассматривать его как общую служебную библиотеку, если вы будете использовать ее в разных проектах. .