Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразуване на дата в друга часова зона в SQL Server

AT TIME ZONE Клаузата беше въведена в SQL Server 2016 за преобразуване на дата в datetimeoffset стойност в целева часова зона.

Тази функция е подобна на някои други T-SQL функции, като SWITCHOFFSET() и TODATETIMEOFFSET() , обаче, AT TIME ZONE Клаузата позволява/(изисква) да посочите изместването на часовата зона по име, вместо действителна стойност на отместване.

Тази статия изследва как AT TIME ZONE работи и обяснява предимствата му в сравнение с другите споменати функции.

Пример за употреба

Ето основен пример за това как AT TIME ZONE клаузата работи.

DECLARE @dto datetimeoffset = '2020-04-01 00:00:00.0000000 +00:00';
SELECT
  @dto AS [Original],
  @dto AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time];

Резултат (с помощта на вертикален изход):

Original | 2020-04-01 00:00:00.0000000 +00:00
NZ Time  | 2020-04-01 13:00:00.0000000 +13:00

Може би се чудите защо Microsoft дори въведе тази функция, когато можеше да използвате SWITCHOFFSET() функция да направи същото?

Е, вие не можете всъщност направете абсолютно същото нещо с SWITCHOFFSET() .

С SWITCHOFFSET() , трябва да предоставите действителното изместване на часовата зона или във формат [+|-]TZH:TZM, или като цяло число със знак (за минути). Това означава, че трябва да знаете точното изместване на часовата зона, и дали тази часова зона в момента спазва лятно часово време или не.

С AT TIME ZONE клауза, не е нужно да знаете това. Всичко, което трябва да знаете, е името на часовата зона (и ето как да получите името на часовата зона).

Пример за лятно часово време

Ето пример, който демонстрира ползата от използването на AT TIME ZONE по отношение на лятното часово време.

DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
  @dto1 AS [@dto1],
  @dto2 AS [@dto2],
  @dto1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto1],
  @dto2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto2];

Резултат (с помощта на вертикален изход):

@dto1          | 2020-04-01 00:00:00.0000000 +00:00
@dto2          | 2020-04-07 00:00:00.0000000 +00:00
NZ Time: @dto1 | 2020-04-01 13:00:00.0000000 +13:00
NZ Time: @dto2 | 2020-04-07 12:00:00.0000000 +12:00

В Нова Зеландия лятното часово време приключва на 5 март 2020 г. Затова в този пример използвам две дати (1 март и 7 март).

Когато ги преобразувам в „Стандартно време на Нова Зеландия“, AT TIME ZONE автоматично включва лятно часово време в своето изчисление и връща приложимата дата/час.

Така че можем да видим, че датата 1 март използва изместване на часовата зона от +13:00, а датата 7 март използва +12:00 (тъй като лятното часово време приключи на 5 март).

Ако бях използвал SWITCHOFFSET() Трябваше да знам кое изместване на часовата зона да използвам за всяка дата.

DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
  @dto1 AS [@dto1],
  @dto2 AS [@dto2],
  SWITCHOFFSET(@dto1, '+12:00') AS [+12:00],
  SWITCHOFFSET(@dto2, '+13:00') AS [+13:00];

Резултат (с помощта на вертикален изход):

@dto1  | 2020-04-01 00:00:00.0000000 +00:00
@dto2  | 2020-04-07 00:00:00.0000000 +00:00
+12:00 | 2020-04-01 12:00:00.0000000 +12:00
+13:00 | 2020-04-07 13:00:00.0000000 +13:00

Преобразуване от дати без изместване на часовата зона

Можете също да използвате AT TIME ZONE на дати без изместване на часовата зона. Всъщност функцията приема всеки израз, който може да бъде разрешен до smalldatetime , дата и час , дата и час2 , или datetimeoffset стойност.

Въпреки това, когато правите това, трябва да имате предвид как се изчислява резултатът. Когато датата е предоставена без информация за отместване, функцията прилага изместването на часовата зона, като приема, че въведената дата е в целевата часова зона.

DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
  @dt1 AS [@dt1],
  @dt2 AS [@dt2],
  @dt1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
  @dt2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];

Резултат:

@dt1          | 2020-04-01 00:00:00
@dt2          | 2020-04-07 00:00:00
NZ Time: @dt1 | 2020-04-01 00:00:00.0000000 +13:00
NZ Time: @dt2 | 2020-04-07 00:00:00.0000000 +12:00

Обърнете внимание, че въпреки че изместванията на часовата зона бяха приложени, както е посочено, това не повлия на датата/часа. И двете получени дата/часа имат една и съща стойност – само отместването на часовата зона е променено.

Ако това не е това, което искате, тогава можете да добавите AT TIME ZONE 'UTC' към микса, за да конвертирате първо оригиналните дати в UTC, преди да бъдат преобразувани в желаната часова зона.

DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
  @dt1 AS [@dt1],
  @dt2 AS [@dt2],
  @dt1 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
  @dt2 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];

Резултат:

@dt1          | 2020-04-01 00:00:00
@dt2          | 2020-04-07 00:00:00
NZ Time: @dt1 | 2020-04-01 13:00:00.0000000 +13:00
NZ Time: @dt2 | 2020-04-07 12:00:00.0000000 +12:00

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Намерете най-близката дата в SQL Server

  2. Какъв е правилният SQL тип за съхраняване на .Net времеви интервал със стойности> 24:00:00?

  3. Отчитане на данни за производителността на SQLDIAG чрез инструмента за RML помощни програми | Отстраняване на проблеми с производителността на SQL Server -7

  4. Системни бази данни на SQL Server – Поддръжка на MSDB

  5. Разликата във времето в SQL между две дати води до hh:mm:ss