2015-02-23 2 views
1

Привет, может кто-то мне помочь с моей функцией. Я получил эту ошибкуФункция для преобразования UTC в CET на сервере sql

Добавление значения в столбец 'datetime2' вызвало переполнение.

Вот моя функция:

CREATE FUNCTION [dbo].[udf_ConvertfromUTCtoCET] (@UTCDate AS DATETIME2(7)) 
RETURNS DATETIME2(7) 
AS 
BEGIN 

DECLARE @DstStart datetime2(7) 
DECLARE @DstEnd datetime2(7) 
DECLARE @CetDate datetime2(7) 

SELECT @DstStart = DATEADD(hour, 1,DATEADD(day, DATEDIFF(day, 0, '31/Mar' + CAST(YEAR(@UTCDate) AS varchar)) - 
     (DATEDIFF(day, 6, '31/Mar' + CAST(YEAR(@UTCDate) AS varchar)) % 7), 0)), 
    @DstEnd = DATEADD(hour, 1,DATEADD(day, DATEDIFF(day, 0, '31/Oct' + CAST(YEAR(@UTCDate) AS varchar)) - 
     (DATEDIFF(day, 6, '31/Oct' + CAST(YEAR(@UTCDate) AS varchar)) % 7), 0)) 



SELECT @CetDate = CASE WHEN @UTCDate <= @DstEnd AND @UTCDate >= @DstStart 
    THEN DATEADD(hour, +2, @UTCDate) 
    ELSE DATEADD(hour, +1, @UTCDate) END 

RETURN @CetDate 
END 

я в датах WarehoureMgmt.DimTime Tabel в формате datetime2 (7), например

9999-12-31 00:00:00.0000000 
0001-01-01 00:00:00.0000000 
2012-01-01 00:00:00.0000000 
2012-01-01 01:00:00.0000000 
2012-01-01 02:00:00.0000000 

и вот что я хочу, чтобы выбрать

select [DateTime],[dbo].[udf_ConvertfromUTCtoCET] ([DateTime]) 
from WarehouseMgmt.DimTime 
+0

Вставьте некоторую логику, которая запретит коду пытаться установить любую из ваших переменных в значение, которое вызовет переполнение. –

+0

Возможный дубликат [sql server convert datetime в другой часовой пояс?] (Http://stackoverflow.com/questions/19613638/sql-server-convert-datetime-into-another-timezone) – TobyLL

+0

Это не дубликат. У меня есть даты db в часовом поясе UTC, и я хочу поместить их в CET, но также есть летние и зимние изменения, поэтому я также должен их правильно преобразовать – Fox

ответ

1

Проблема, вероятно, является величиной, большей 9999-12-31 23:00:00.0000000 в вашем хранилище данных - добавление 1 или 2 часов к этому приведет к переполнению. Если вы делаете

select max ([DateTime]) from WarehouseMgmt.DimTime 

вы найдете наибольшее значение.

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