Как преобразовать SqlServer DateTime в универсальное время, используя SQL - PullRequest
2 голосов
/ 15 октября 2008

У меня есть база данных с полями DateTime, которые в настоящее время хранятся по местному времени. Предстоящий проект потребует, чтобы все эти даты были переведены в универсальное время. Вместо того чтобы писать приложение на c # для преобразования этого времени в универсальное время, я бы лучше использовал доступные функции sqlserver / sql для точного преобразования этих дат в универсальное время, поэтому мне нужен только скрипт обновления. Чтобы быть точным, конверсия должна учитывать колебания летнего времени и т. Д.

Ответы [ 4 ]

0 голосов
/ 02 сентября 2011

Проверьте эту ссылку с CodeProject.com - она ​​делает именно то, что вы хотите: взять дату и часовой пояс, передать их в UDF и получить дату в UTC или любом другом часовом поясе .

ВАЖНО: Проверьте комментарии к этой статье - автору не разрешено редактировать статью после определенного момента, и в комментариях есть обновленная версия кода, используемого для пользовательских функций, которая устраняет некоторые проблемы, не найденные в оригинальный код статьи.

ТАКЖЕ ВАЖНО: не используйте это для запроса больших наборов данных. Это идеально подходит для одноразовой загрузки в базу данных или для возврата даты UTC для одной строки (например, таблицы входа пользователя или чего-то еще.)

Если вам нужна производительность, единственный действительно приемлемый метод для преобразования часового пояса - это иметь справочную таблицу, которая обрабатывает каждое возможное преобразование часового пояса для каждого часа в году, с оператором case для обработки переходов между годами (например, декабрь). 31 - 1 января или наоборот.) Да, таблица огромна, но производительность запросов равна нулю.

0 голосов
/ 15 октября 2008

Пользовательская функция позволит вам написать запрос SQL, который выглядит следующим образом:

SELECT toUTC([MyDateColumn], [MyTimeZoneColumn]) FROM [MyTable]

Тогда вы получите универсальное время от сервера без большого количества уродливого синтаксиса в самом запросе. Теперь вы можете создать UDF для этого с помощью обычного SQL, аналогичного тому, который написал Крис, но SQL Server 2005 и более поздние версии позволят вам создать UDF с использованием CLR (.Net: C # необязательно). У него гораздо лучшая поддержка дат, и он может лучше выполнять работу с учетом часовых поясов и летнего времени.

0 голосов
/ 17 октября 2008

проверить функцию преобразования и функцию getutcdate?

http://msdn.microsoft.com/en-us/library/ms187928.aspx

0 голосов
/ 15 октября 2008

SQL Для этого ничего не встроено.

Два способа будут C# application (вы упомянули, что вы не хотите) или написать действительно сложное заявление об обновлении с чем-то вроде:

UtcDate = DATEADD(hour, CASE WHEN OriginalDate BETWEEN x AND y THEN 4 
WHEN OriginalDate BETWEEN x2 AND y2 THEN 5 ... END, OriginalDate)

Примечание - я бы порекомендовал C# app плюс что-то вроде TZ4Net для обработки преобразования.

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