Переход на летнее время на сервере SQL - PullRequest
2 голосов
/ 28 апреля 2009

Мы используем старое приложение, которое хранит даты в формате C / Unix. Время C - это в основном количество секунд с 1 января 1970 года. Даты хранятся в виде целого числа в базе данных SQL Server. Я пишу представление для отчета, в котором используются эти даты.

Пока что я конвертирую из времени UNIX в родную дату и время:

DateAdd(s,3600+unix_time,'1/1/1970')

3600 - конвертировать из UTC в местный часовой пояс GMT + 1. Это точно зимой, но летом это один час из-за перехода на летнее время.

Существует ли встроенный способ преобразования UTC в местное время в SQL Server?

Ответы [ 3 ]

6 голосов
/ 10 января 2012

На самом деле, ответ выше пренебрегает переходом на летнее время. Если в настоящее время летнее время не установлено, дата в летнее время будет на часе выключена, и наоборот. Кроме того, законодатели во многих странах любят делать переход на летнее время более сложным, чем это необходимо.

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

Это всего лишь одно из тех колес, которое последовательно изобретается неправильно.

0 голосов
/ 18 апреля 2014

У меня была похожая проблема с UTC / GMT1, и хотя многие заявления о том, что вы хотите этого избежать в базе данных, являются очень верным и ценным советом, не всегда возможно избежать этого полностью.

Однако, когда вы работаете с GMT1, вам повезло, поскольку переход на летнее время для этого фактически основан на алгоритме. (В отличие от США летнее время, которое, как я понимаю, определяется законодательными органами.)

Из этого я смог сделать эту хранимую процедуру, которая преобразует ввод даты и времени UTC в дату и время по Гринвичу1. Надеюсь, это поможет;)

CREATE PROCEDURE spUTCGMT1 @date AS DATETIME
AS 
BEGIN
     DECLARE @year AS INT = DATEPART( YYYY,@date)
     DECLARE @f AS INT = (FlOOR( (5 * @year) / 4) - FLOOR( @year / 100)+ FLOOR( @year / 400)) % 7

     IF(@date BETWEEN 
        DATEADD( DD,- ((@f + 5) % 7),(CAST(@year AS CHAR(4)) + '-03-31')) AND 
        DATEADD( DD,- ((@f + 2) % 7),(CAST(@year AS CHAR(4)) + '-10-31')))
     SELECT 
            DATEADD( HH,2,@date)
     ELSE
     SELECT 
            DATEADD( HH,1,@date)
END
0 голосов
/ 28 апреля 2009

Вместо 3600 вы захотите сделать DateDiff (s, getutcdate (), getdate ()) + unix_time, что даст вам правильное смещение от времени UTC.

Приветствия
Eric

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