я хочу циклично выполниться в течение времени в tsql и распечатать UTC datetimes и наш локальный вариант. Мы живем в UTC +1, таким образом, я мог легко добавить 1 час, но в летнем периоде мы живем в UTC +2.
В C# я могу создать дату и время и использовать метод для просьбы вариант UTC и наоборот.
До настоящего времени у меня есть это:
declare @counter int
declare @localdate datetime
declare @utcdate datetime
set @counter = 0
while @counter < 100
begin
set @counter = @counter + 1
print 'The counter is ' + cast(@counter as char)
set @utcdate = DATEADD(day,@counter,GETUTCDATE())
--set @localdate = ????
print @localdate
print @utcdate
end
Предполагая, что вы используете SQL 2005 и выше, вы можете разработать SQL-функция CLR, которая принимает дату в формате UTC и конвертирует ее в местную дату.
Эта ссылка представляет собой инструкции MSDN, объясняющие, как можно создать скалярную UDF на C #.
Создайте функцию SQL в соответствии со строками
[SqlFunction()]
public static SqlDateTime ConvertUtcToLocal(SqlDateTime utcDate)
{
// over to you to convert SqlDateTime to DateTime, specify Kind
// as UTC, convert to local time, and convert back to SqlDateTime
}
Ваш пример, приведенный выше, затем станет
set @localdate = dbo.ConvertUtcToLocal(@utcdate)
SQL CLR имеет свои накладные расходы с точки зрения развертывания, но я считаю, что такие случаи, как это, подходят лучше всего.
GETUTCDATE() просто дает вам текущее время в UTC, любое DATEADD(), которое вы сделаете с этим значением, не будет включать сдвиги летнего времени.
Лучше всего построить собственную таблицу перевода UTC или просто использовать что-то вроде этого:
http://www.codeproject.com/KB/database/ConvertUTCToLocal.aspx