Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för: SQL Server 2016 (13.x) och senare versioner
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL Analytics-slutpunkt i Microsoft Fabric
Warehouse i Microsoft Fabric
SQL Database i Microsoft Fabric
Satsen AT TIME ZONE Transact-SQL (T-SQL) konverterar en input_date till motsvarande datumtidsavvikningsvärde i måltidszonen. När input_date tillhandahålls utan offsetinformation tillämpar funktionen tidszonens offset under antagandet att input_date befinner sig i måltidszonen.
Om input_date anges som ett datumtidsavvikningsvärde , konverterar AT TIME ZONE klausulen det till måltidszonen med hjälp av tidszonskonverteringsreglerna.
Implementeringen AT TIME ZONE bygger på en Windows-mekanism för att konvertera datumtidsvärden över tidszoner.
Transact-SQL syntaxkonventioner
Syntax
input_date AT TIME ZONE time_zone_value
input_date AT TIME ZONE { 'time_zone_value' | 'LOCAL' }
Arguments
input_date
Ett uttryck som kan matchas till ett smalldatetime-, datetime-, datetime2- eller datetimeoffset-värde .
'time_zone_value'
Namnet på måltidszonen. time_zone_value är nvarchar(128).
SQL Server förlitar sig på tidszoner som lagras i Windows-registret. Tidszoner som är installerade på datorn lagras i följande registerdatafil: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.
En lista över installerade tidszoner visas också via sys.time_zone_info systemvy.
Mer information om tidszoner för SQL Server i Linux finns i Konfigurera tidszonen för SQL Server 2022 och senare versioner på Linux.
{ 'time_zone_value' | 'LOKAL' }
Namnet på måltidszonen.
time_zone_value är nvarchar(128), med standardvärdet .LOCAL
En lista över installerade tidszoner visas via sys.time_zone_info systemvy.
Om LOCAL anges anges det aktuella standardvärdet i tidszonen för sessionen till sessionens ursprungliga tidszonsvärde, vilket kan vara antingen databasbegränsat alternativ eller instansstandard.
Returtyper
Returnerar datatypen datetimeoffset.
Returvärde
Datetimeoffset-värdet i måltidszonen.
Remarks
AT TIME ZONE tillämpar specifika regler för att konvertera indatavärden i datatyperna smalldatetime, datetime och datetime2 som infaller i ett intervall som påverkas av en DST-ändring:
När klockan har ställts in framåt finns det en lucka i lokal tid som motsvarar klockjusteringens varaktighet. Den här varaktigheten är vanligtvis 1 timme, men det kan ta 30 eller 45 minuter, beroende på tidszon. Tidpunkter som finns i det här gapet konverteras med förskjutningen efter DST-ändringen.
/* Moving to DST in "Central European Standard Time" zone: offset changes from +01:00 -> +02:00 Change occurred on March 27th, 2022 at 02:00:00. Adjusted local time became 2022-03-27 03:00:00. */ --Time before DST change has standard time offset (+01:00) SELECT CONVERT (DATETIME2 (0), '2022-03-27T01:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-03-27 01:01:00 +01:00 /* Adjusted time from the "gap interval" (between 02:00 and 03:00) is moved 1 hour ahead and presented with the summer time offset (after the DST change) */ SELECT CONVERT (DATETIME2 (0), '2022-03-27T02:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-03-27 03:01:00 +02:00 --Time after 03:00 is presented with the summer time offset (+02:00) SELECT CONVERT (DATETIME2 (0), '2022-03-27T03:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-03-27 03:01:00 +02:00När klockan ställs in igen överlappas 2 timmars lokal tid till en timme. I så fall visas de tidpunkter som hör till det överlappande intervallet med förskjutningen innan klockan ändras:
/* Moving back from DST to standard time in "Central European Standard Time" zone: offset changes from +02:00 -> +01:00. Change occurred on October 30th, 2022 at 03:00:00. Adjusted local time became 2022-10-30 02:00:00 */ --Time before the change has DST offset (+02:00) SELECT CONVERT (DATETIME2 (0), '2022-10-30T01:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-10-30 01:01:00 +02:00 /* Time from the "overlapped interval" is presented with DST offset (before the change) */ SELECT CONVERT (DATETIME2 (0), '2022-10-30T02:00:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-10-30 02:00:00 +02:00 --Time after 03:00 is regularly presented with the standard time offset (+01:00) SELECT CONVERT (DATETIME2 (0), '2022-10-30T03:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-10-30 03:01:00 +01:00
Eftersom viss information (till exempel tidszonsregler) underhålls utanför SQL Server och kan komma att ändras tillfälligt, AT TIME ZONE klassificeras funktionen som icke-terministisk.
Datetimeoffset stöds inte i datalager i Microsoft Fabric, AT TIME ZONE men kan fortfarande användas med datetime2, som i följande exempel.
Examples
A. Lägg till måltidsförskjutning till datetime utan förskjutningsinformation
Använd AT TIME ZONE för att lägga till förskjutning baserat på tidszonsregler när du vet att de ursprungliga datetime-värdena anges i samma tidszon:
USE AdventureWorks2025;
GO
SELECT SalesOrderID,
OrderDate,
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;
Här är resultatet.
SalesOrderID OrderDate OrderDate_TimeZonePST
------------ ----------------------- -------------------------------
43659 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43660 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43661 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43662 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43663 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43664 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
...
B. Konvertera värden mellan olika tidszoner
I följande exempel konverteras värden mellan olika tidszoner. Värdena OrderDate är datetime och lagras inte med en förskjutning, men är kända för att vara Pacific Standard Time. Det första steget är att tilldela den kända förskjutningen och sedan konvertera till den nya tidszonen:
USE AdventureWorks2025;
GO
SELECT SalesOrderID,
OrderDate,
--Assign the known offset only
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST,
--Assign the known offset, then convert to another time zone
OrderDate AT TIME ZONE 'Pacific Standard Time' AT TIME ZONE 'Central European Standard Time' AS OrderDate_TimeZoneCET
FROM Sales.SalesOrderHeader;
Här är resultatet.
SalesOrderID OrderDate OrderDate_TimeZonePST OrderDate_TimeZoneCET
------------ ----------------------- ------------------------------ -------------------------------
43659 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43660 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43661 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43662 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43663 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43664 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
...
Du kan också ersätta i en lokal variabel som innehåller tidszonen:
USE AdventureWorks2025;
GO
DECLARE @CustomerTimeZone AS NVARCHAR (128) = 'Central European Standard Time';
SELECT SalesOrderID,
OrderDate,
--Assign the known offset only
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST,
--Assign the known offset, then convert to another time zone
OrderDate AT TIME ZONE 'Pacific Standard Time' AT TIME ZONE @CustomerTimeZone AS OrderDate_TimeZoneCustomer
FROM Sales.SalesOrderHeader;
Här är resultatet.
SalesOrderID OrderDate OrderDate_TimeZonePST OrderDate_TimeZoneCustomer
------------ ----------------------- ------------------------------ -------------------------------
43659 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43660 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43661 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43662 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43663 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43664 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
...
C. Fråga temporala tabeller med hjälp av en specifik tidszon
Följande exempel väljer data från en tidstabell med WideWorldImporters hjälp av Pacific Standard Time.
USE WideWorldImporters;
GO
DECLARE @ASOF AS DATETIMEOFFSET;
SET @ASOF = DATEADD(MONTH, -1, GETDATE()) AT TIME ZONE 'UTC';
-- Query state of the table a month ago projecting period
-- columns as Pacific Standard Time
SELECT CustomerID,
CustomerName,
ValidFrom AT TIME ZONE 'Pacific Standard Time'
FROM Sales.Customers FOR SYSTEM_TIME AS OF @ASOF;
Här är resultatet.
CustomerID CustomerName ValidFrom
---------- ----------------------------------- ----------------------------------
1 Tailspin Toys (Head Office) 2013-01-01 00:00:00.0000000 -08:00
2 Tailspin Toys (Sylvanite, MT) 2013-01-01 00:00:00.0000000 -08:00
3 Tailspin Toys (Peeples Valley, AZ) 2013-01-01 00:00:00.0000000 -08:00
4 Tailspin Toys (Medicine Lodge, KS) 2013-01-01 00:00:00.0000000 -08:00
5 Tailspin Toys (Gasport, NY) 2013-01-01 00:00:00.0000000 -08:00
6 Tailspin Toys (Jessie, ND) 2013-01-01 00:00:00.0000000 -08:00