Можете да използвате SWITCHOFFSET()
функция в SQL Server за промяна на отместването на часовата зона на datetimeoffset стойност.
Функцията приема два аргумента; a datetimeoffset(n) стойност (или израз, който може да бъде разрешен до datetimeoffset(n) стойност) и новата часова зона.
Пример
Ето пример за демонстрация.
ДЕКЛАРИРАЙТЕ @dto datetimeoffset ='2020-12-20 17:33:59.8900000 +02:00';ИЗБЕРЕТЕ @dto КАТО [Оригинал], SWITCHOFFSET(@dto, '+04:00') КАТО [ Променено];
Резултат (с помощта на вертикален изход):
Оригинал | 20.12.2020 17:33:59.8900000 +02:00 Променено | 20.12.2020 19:33:59.8900000 +04:00
Имайте предвид, че изместването на часовата зона е посочено като низ. Това е така, защото го предоставих за часове.
Когато е посочено в часове, изместването на часовата зона трябва да използва формата [+|-]TZH:TZM и да бъде посочено като низ (ограден в единични кавички).
Използвайте минутите като отместване на часовата зона
Като алтернатива можете да посочите изместването на часовата зона в минути. Когато правите това, трябва да го посочите като цяло число.
DECLARE @dto datetimeoffset ='2020-12-20 17:33:59.8900000 +02:00';ИЗБЕРЕТЕ @dto КАТО [Оригинал], SWITCHOFFSET(@dto, 240) КАТО [Променено];код>
Резултат (с помощта на вертикален изход):
Оригинал | 20.12.2020 17:33:59.8900000 +02:00 Променено | 20.12.2020 19:33:59.8900000 +04:00
Пример за база данни
Ето пример за използване на SWITCHOFFSET()
върху стойността от колона в таблица на база данни.
CREATE TABLE Test ( Col1 datetimeoffset ); INSERT INTO Test VALUES ('1967-12-20 17:33:59.8900000 -07:00'); ИЗБЕРЕТЕ Col1, SWITCHOFFSET(Col1, '-08:00') КАТО Променено ОТ тест;
Резултат (с помощта на вертикален изход):
<пред>Кол1 | 1967-12-20 17:33:59.8900000 -07:00 Променено | 1967-12-20 16:33:59.8900000 -08:00Ефективност при използване на стойност GETDATE()
Microsoft съветва да използвате SWITCHOFFSET()
с GETDATE()
функцията може да доведе до бавно изпълнение на заявката, тъй като оптимизаторът на заявки не може да получи точни оценки за кардиналите за дата и час стойност.
За да разрешите този проблем, използвайте OPTION (RECOMPILE)
намек за заявка. Това принуждава оптимизатора на заявки да прекомпилира план за заявка следващия път, когато същата заявка бъде изпълнена.
Не знаете изместването на часовата зона?
Ако не знаете изместването на часовата зона, което да използвате, ето как да получите списък с поддържани часови зони в SQL Server.
Едно нещо, за което трябва да имате предвид, е лятното часово време. Много държави/региони имат свои специфични правила за спазване на лятното часово време (а някои изобщо не го спазват). Това може да причини всякакви проблеми, когато се опитвате да решите дали да вземете предвид лятното часово време в изместването на часовата си зона.
За щастие SQL Server измисли начин да се справи с това. SQL Server 2016 въведе AT TIME ZONE
клауза. Тази клауза ви позволява да посочите името на часова зона, а не самото изместване на часовата зона. Следователно можете просто да използвате „Стандартно време в планината на САЩ“ или „Стандартно време в Индия“ или каквато часова зона е приложима.
Вижте Преобразуване на дата в друга часова зона за примери как да направите това.