Я столкнулся с этой же проблемой, потому что хотел выполнить преобразование между локальным и UTC в запросе, который использовался службами отчетов. Я прошел через то, что, кажется, точно такое же сражение, как вы проходите с этим. Мое решение ...
Я начал писать отдельное приложение, которое просматривало объект TimeZoneInfo и записывало записи в таблицу TimeZoneInfo в моей базе данных. Я сохранил все смещения (включая смещения при переходе на летнее время) для каждого года от начального до конечного года (это были аргументы для отдельного приложения).
Из этой таблицы я смог создать некоторые функции sql, которые будут принимать дату в utc или local и timezone, использовать таблицу поиска TimeZoneInfo, чтобы получить правильное смещение для правильного времени года и часового пояса, и вернуть дата и время конвертируются в UTC или местное.
К сожалению, я еще не закончил. Мне пришлось создать функцию CLR, которая возвращала бы текущий часовой пояс системы, используя библиотеку, безопасную для SQL Server (в отличие от объекта TimeZoneInfo). В данный момент у меня нет доступа к моему коду, но я полагаю, что использовал объект TimeZone.
http://msdn.microsoft.com/en-us/library/system.timezone_members.aspx
Подводя итог, у меня была функция CLR, которая возвращала часовой пояс системы, приложение, которое создавало таблицу поиска часовых поясов с конкретной информацией DLS за диапазон лет. Я завершил все это с помощью хранимой процедуры, которая заняла временную зону и дату для преобразования, и с тех пор она прекрасно работает.
Я понимаю, что это ОГРОМНАЯ работа по созданию чего-то, что казалось довольно простым, но оно выполнило работу безопасно.