Published on

September 21, 2007

Понимание часовых поясов в SQL Server

DateTime часто может вызывать головную боль у разработчиков баз данных, особенно при работе с различными комбинациями часовых поясов. В этой статье мы рассмотрим распространенную проблему, связанную с DateTime в SQL Server, и обсудим потенциальное решение.

Проблема

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

Например, давайте рассмотрим систему отелей с отелями в Найроби, Кения; Куала-Лумпур, Малайзия; и Гавайи. У каждого местоположения есть свой собственный SQL Server, и данные со всех этих серверов должны быть переданы на главную систему, работающую на Гавайях. Хранение данных с их соответствующими локальными временами создаст путаницу при попытке определить фактическое время.

Решение: Всемирное координированное время (UTC)

Для преодоления этой проблемы один из подходов – хранить все значения DateTime в Всемирном координированном времени (UTC), также известном как среднее время по Гринвичу (GMT). UTC – это стандартная временная ссылка, независимая от часовых поясов.

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

Использование функций SQL Server

В SQL Server функцию GetUTCDate() можно использовать для получения текущего времени в формате UTC. Эта функция возвращает значение datetime, представляющее текущее время UTC, полученное из текущего локального времени и настройки часового пояса в операционной системе компьютера, на котором работает SQL Server.

Для преобразования значения DateTime в UTC можно использовать следующую хранимую процедуру:

CREATE PROCEDURE [dbo].[Convert_DateTime_to_GMT] 
    @dt_Date_Time as datetime 
AS 
SELECT DATEADD(hh, (DATEDIFF(hh, GETDATE(), GETUTCDate())), @dt_Date_Time)
GO

Вот пример использования этой функции:

DECLARE @dt datetime
SET @dt = CAST('2003/10/12 13:12' AS datetime)
EXEC [dbo].[Convert_DateTime_to_GMT] @dt

Аналогично, для преобразования значения UTC DateTime обратно в системное DateTime можно использовать следующую хранимую процедуру:

CREATE PROCEDURE [dbo].[Convert_GMT_to_DateTime] 
    @dt_GMT as datetime 
AS 
SELECT DATEADD(hh, (DATEDIFF(hh, GETUTCDate(), GETDATE())), @dt_GMT)
GO

Используя эти функции, вы можете обеспечить последовательное преобразование значений DateTime между UTC и системным временем, что упрощает работу с данными из разных часовых поясов.

Сравнение с Oracle

Следует отметить, что у Oracle есть свой набор функций и возможностей, связанных с часовыми поясами. Например, Oracle предоставляет функции, такие как DBTIMEZONE, SYS_EXTRACT_UTC и TZ_OFFSET, для обработки преобразований часовых поясов. Кроме того, Oracle предлагает функцию NEW_TIME, которая позволяет преобразовывать значения DateTime между разными часовыми поясами.

Хотя SQL Server может не иметь такой обширной встроенной функциональности для часовых поясов, как Oracle, важно помнить, что будущие версии SQL Server могут внедрить больше функций в этой области, что сделает его еще более удобным для конечных пользователей и администраторов баз данных.

Заключение

DateTime и преобразования часовых поясов могут быть сложными, особенно при работе с данными из нескольких часовых поясов. Храня значения DateTime в UTC и используя функции SQL Server для преобразования, вы можете обеспечить последовательность и точность при работе с данными из разных часовых поясов. Хотя SQL Server может не иметь всех функций Oracle в этом отношении, будущие обновления могут принести больше функциональности, чтобы облегчить работу администраторам баз данных.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.