Как конвертировать часовые пояса в SQL Server 2005? - PullRequest
1 голос
/ 08 июля 2010

Все мое время находится в часовом поясе UTC, теперь мне нужно каким-то образом преобразовать его в часовой пояс пользователя (он также хранится в БД и использует идентификаторы часовых поясов Windows).

Как я могусделать это в SQL Server 2005?

Изменить

Поэтому я попытался сделать эту расширенную хранимую процедуру, но с Timezoneinfo я получаю эту ошибку

Ошибка развертывания SQL01268:.Net SqlClient Data Provider: Msg 6503, уровень 16, состояние 12, сборка линии 1 «system.core, версия = 3.5.0.0, культура = нейтральный, publickeytoken = b77a5c561934e089».не был найден в каталоге SQL.Произошла ошибка во время выполнения пакета.

, если я выну эту строку, я смогу развернуть ее.Есть идеи как обойти это?

Ответы [ 5 ]

0 голосов
/ 09 июля 2010

Я использую эту функцию:

CREATE FUNCTION fnConvertGMTToLocalTime
(
    @GMTValue   Datetime,
    @TimeZoneOffset int
)
RETURNS DateTime
AS
BEGIN
    DECLARE @LocalTime dateTime

    SELECT @LocalTime = DateAdd(Hour, @TimeZoneOffset, @GMTvalue)

    RETURN @LocalTime
END

Летнее время не учитывается ... но мне все равно это не нужно.

0 голосов
/ 08 июля 2010

SQL Server 2008 будет иметь тип данных DATETIMEOFFSET (который включает в себя часовой пояс) плюс такие функции, как SWITCHOFFSET для переключения с одного смещения часового пояса на другой.

Но в версии 2005 года часовые пояса практически не поддерживаются.

Есть ли шанс, что вы сможете обновить в ближайшее время ??

0 голосов
/ 08 июля 2010

Написал это только для вас:

DECLARE @UTCDate DateTime /* Replace with the UTC datetime stored in your table */
DECLARE @LocalDate DateTime
DECLARE @TimeZoneOffset int /* Replace with the offset stored in your table */
SET @TimeZoneOffset = -8 /* PST */
SET @UTCDate = GETUTCDATE()
SET @LocalDate = DATEADD(Hour, @TimeZoneOffset, @UTCDate)
SELECT @UTCDate
SELECT @LocalDate

Дайте мне знать, если это не работает.

0 голосов
/ 08 июля 2010

Поскольку SQL Server не предоставляет встроенную поддержку для этого, вы можете рассмотреть возможность написания хранимой процедуры .Net dll, которая использует объект .Net TimeZoneInfo , этот объект принимает все правила в том числе DST во внимание. Этот класс позволяет вам также конвертировать время из одной зоны в другую. Надеюсь, это поможет.

DateTime hwTime = new DateTime(2007, 02, 01, 08, 00, 00);
try
{
   TimeZoneInfo hwZone = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time");
   Console.WriteLine("{0} {1} is {2} local time.", 
           hwTime, 
           hwZone.IsDaylightSavingTime(hwTime) ? hwZone.DaylightName : hwZone.StandardName, 
           TimeZoneInfo.ConvertTime(hwTime, hwZone, TimeZoneInfo.Local));
}
catch (TimeZoneNotFoundException)
{
   Console.WriteLine("The registry does not define the Hawaiian Standard Time zone.");
}                           
catch (InvalidTimeZoneException)
{
   Console.WriteLine("Registry data on the Hawaiian STandard Time zone has been corrupted.");
}

[Изменить]

Учебное пособие по созданию простой хранимой процедуры .Net DLL.

Еще один полезный учебник, в котором более подробно рассказывается о развертывании.

0 голосов
/ 08 июля 2010

SQL Server не предоставляет простой способ преобразования значения даты и времени в формате UTC в значение местного времени.

Тем не менее, страница с включает в себя:

Таблица (tbTimeZoneInfo) с данные для предоставления часового пояса информация и две функции для преобразовать значение даты и времени UTC в любое Местный часовой пояс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...