2010-02-16 2 views
2

UPDATEВ C#, конвертировать SQL Server 2005 значения даты и времени в другой часовой пояс

Я имею дело с унаследованной базой данных, где значения DateTime были сохранены в определенном часовом поясе (не UTC). Предположим, что невозможно изменить, как мы храним эти значения.

END UPDATE

Say У меня есть база данных SQL Server 2005 с таблицей следующим образом:

[id] (int) not null 
[create_date] (datetime) not null 

Пусть мой [create_date] был сохранен, по соглашению, в качестве часового пояса TZ-A ,

Предположим, что я хочу получить это значение (используя SqlClient) из базы данных и отобразить его в другом часовом поясе TZ-B.

Как это сделать?

DateTime from_db = // retrieve datetime from database, in timezone TZ-A 
DateTime to_display = //convert from_db to another timezone, TZ-B 

ответ

2

Использование TimeZoneInfo

TimeZoneInfo timeZone1 = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
TimeZoneInfo timeZone2 = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTime to_display= TimeZoneInfo.ConvertTime(from_db, timeZone1, timeZone2); 

Я также согласен, что сохранение в формате UTC является путь. Единственный недостаток - это объяснить UTC пользователям, которые хотят писать свои собственные отчеты.

+0

Спасибо за ответ :) – frankadelic

2

Каждый человек имеет C# пути, я даю вам TSQL (к сожалению, только 2008):

Смотрите ниже документ, вы, вероятно, хотите что-то вроде:

-- up here set the @time_zone variable. 

SELECT 
    COl0, TODATETIMEOFFSET(COLDATE, @time_zone),.... ColN, from 
Table_Original; 

От MSDN

The Функция SWITCHOFFSET настраивает значение ввода DATETIMEOFFSET на заданный часовой пояс , сохраняя при этом значение UTC. Синтаксис: SWITCHOFFSET (datetimeoffset_value, time_zone). Например, следующий код корректирует текущую систему значение DateTimeOffset для часового пояса GMT +05: 00:

ВЫБОР SWITCHOFFSET (SYSDATETIMEOFFSET(), '-05: 00');

Так что, если текущая система значение DateTimeOffset 12 февраля 2009 10: 00: 00,0000000 -08: 00, этот код возвращает значение Февраль 12, 2009 13: 00: 00,0000000 -05: 00.

Функция TODATETIMEOFFSET устанавливает смещение часового пояса даты ввода и значение времени .Его синтаксис: TODATETIMEOFFSET (date_and_time_value, time_zone).

Эта функция отличается от SWITCHOFFSET несколькими способами. Во-первых, не ограничивается значением datetimeoffset в качестве входных данных; скорее принимает любые данные о дате и времени тип. Во-вторых, он не пытается настроить время, основываясь на разнице зоны времени между исходным значением и заданной временной зоны, но вместо этого просто возвращает дату ввода и значение времени с заданным временем зоны в качестве значения DateTimeOffset ,

Основная цель функции TODATETIMEOFFSET является преобразования типов, которые не временная зона известно, чтобы DateTimeOffset по заданному смещение часового пояса. Если данная дата и время значения является DateTimeOffset, функции TODATETIMEOFFSET изменяет значение DateTimeOffset, основываясь на же исходной локальном значении даты и время плюс новой данные временной зоны смещения.

Например, текущая система значение DateTimeOffset является 12 февраля, 2009 10: 00: 00,0000000 -08: 00, и вы запустить следующий код:

ЗЕЬЕСТ TODATETIMEOFFSET (SYSDATETIMEOFFSET(), '-05: 00');

Значение 12 февраля 2009 г. 10: 00: 00.0000000 -05: 00 возвращается. Помните, что функция SWITCHOFFSET вернулся 12 февраля 2009 13: 00: 00.0000000 -05: 00, потому что скорректировал время на основе разницы времени зоны между входом (-08: 00), и указанный часовой пояс (-05: 00).

Как уже упоминалось ранее, вы можете использовать функцию TODATETIMEOFSFSET с любыми данными типа даты и времени в качестве входных данных. Для Например, следующий код принимает текущую системную дату и значение времени и возвращает его в виде значения DateTimeOffset с временной зоной -00: 05:

ВЫБОР TODATETIMEOFFSET (SYSDATETIME(), «-05: 00');

+0

DATETIMEOFFSET является специфичным SQL 2008, недоступным в SQL 2005 –

+0

@Remus: хорошая точка, я отредактировал, чтобы указать на то, что ... явно откровенный должен купить 2008 для этой функции (усмешка). – Hogan

+0

сжатие страниц данных, теперь есть причина для покупки SQL 2008;) –

1

Всегда хранить данные в базе данных как UTC. Затем преобразовать его в клиенте для отображения от UTC к местному времени, используя DateTime.ToLocalTime();

2

Я не буду предлагать ответ, а слово советов: Всегда магазина абсолютных даты в UTC, независимо от того, что ,

+0

Мы имеем дело с устаревшей системой, где это невозможно. – frankadelic

+0

О, хорошо. Я знаю, как это отстой :( – kprobst

Смежные вопросы