sql >> Database >  >> RDS >> Sqlserver

Converteer 'datetime' naar 'datetimeoffset' in SQL Server (T-SQL-voorbeelden)

Dit artikel bevat voorbeelden van het converteren van een datetime waarde naar een datetimeoffset waarde in SQL Server.

Wanneer u een datetime . converteert waarde naar datetimeoffset , hangt de resulterende waarde af van de precisie van een fractie van een seconde die u toewijst aan datetimeoffset , evenals elke tijdzoneverschuiving die u opgeeft.

De datetime gegevenstype heeft een maximum van 3 cijfers voor het gedeelte met breuken in seconden. De nauwkeurigheid wordt afgerond op stappen van .000, .003 of .007 seconden.

De datetimeoffset Met het gegevenstype daarentegen kunt u een precisie van een fractie van een seconde specificeren van 0 tot 7. Als u dit niet opgeeft, wordt 7 gebruikt (de standaard). Het heeft ook een tijdzone-offset en kan eventuele offsets in de oorspronkelijke waarde behouden. Echter, datetime heeft geen tijdzonebewustzijn, dus er zijn geen bestaande waarden om te behouden. In dit geval wordt de tijdzone-offset standaard ingesteld op +00:00.

SQL Server heeft eigenlijk de TODATETIMEOFFSET() functie, die speciaal is ontworpen om een ​​datum/tijd-waarde om te zetten in datetimeoffset en voeg een tijdzone-offset toe. Er is echter een subtiel detail waar u op moet letten bij het gebruik van deze functie, en ik leg dit hieronder uit (met voorbeelden).

Voorbeeld 1 – Impliciete conversie

Ten eerste is hier een voorbeeld van een impliciete conversie tussen datetime en datetimeoffset .

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Resultaat:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +00:00 |
+-------------------------+------------------------------------+

Dit is een impliciete conversie omdat we geen conversiefunctie (zoals hieronder) gebruiken om deze expliciet te converteren. In dit geval voert SQL Server achter de schermen een impliciete conversie uit wanneer we proberen de datetime toe te wijzen waarde naar een datetimeoffset variabel.

We kunnen zien dat de datetimeoffset variabele heeft meer fractionele seconden precisie, en we eindigen met een fractioneel deel van 1233333 (vs 123 voor de datetime waarde). We eindigen ook met een tijdzoneverschuiving van +00:00 .

Het gebruik van 7 fractionele seconden precisie veroorzaakt datetimeoffset om 10 bytes voor opslag te gebruiken (11 bytes als u de byte opneemt die de precisie opslaat). Ter vergelijking:datetime gebruikt slechts 8 bytes. U kunt echter de precisie van de datetimeoffset . verminderen waarde door de 7 te vervangen door een lager getal. Dit is hetzelfde concept als bij het gebruik van de datetime2 data type. Zie 'datetime' converteren naar 'datetime2' in SQL Server voor voorbeelden van hoe dit het eindresultaat kan beïnvloeden.

Voorbeeld 2 – Afronding

De datetime gegevenstype wordt afgerond op stappen van .000, .003 of .007 seconden. Zelfs als u het expliciet op een andere waarde instelt, wordt het afgerond. Dit kan voor veel verwarring zorgen als u niet weet hoe het werkt. Het kan niet alleen verwarring veroorzaken bij het gebruik van datetime op zichzelf kan het extra verwarring veroorzaken bij het converteren van die waarde naar een ander gegevenstype.

Hier is een voorbeeld dat laat zien wat ik bedoel.

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Resultaat:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

In dit voorbeeld stel ik de fractionele seconden in op 125 maar datetime afgerond op 127 (omdat dit gegevenstype alleen kan worden afgerond op stappen van .000, .003 of .007 seconden).

De datetimeoffset waarde aan de andere kant, stel de fractionele seconden in op 1266667 .

Als we echter gewoon de beginwaarde zouden instellen op datetimeoffset in de eerste plaats zou het fractionele deel ervan 1250000 hebben geretourneerd .

Voorbeeld 3 – Expliciete conversie met CAST()

Hier is een voorbeeld van een expliciete conversie. In dit geval gebruik ik de CAST() functie direct binnen de SELECT statement om expliciet te converteren tussen datetime en datetimeoffset .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';

Resultaat:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

Voorbeeld 4 – Expliciete conversie met CONVERT()

Hier is een voorbeeld van een expliciete conversie met de CONVERT() functie in plaats van CAST() .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';

Resultaat:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

Voorbeeld 5 – De tijdzone-offset wijzigen

Als je de moeite neemt om je datetime . te converteren waarden naar datetimeoffset , hebt u waarschijnlijk de tijdzone-offset nodig. En er is een grote kans dat u het wilt instellen op iets anders dan +00:00.

Gelukkig kun je de TODATETIMEOFFSET() . gebruiken functie om de offset te wijzigen.

U kunt deze functie ook gebruiken om de originele datetime . te converteren waarde naar een datetimeoffset waarde. Deze functie accepteert een datum/tijd-waarde (die kan worden omgezet in een datetime2 waarde) en een offsetwaarde.

Hier is een voorbeeld:

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime, '+07:00');
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset';

Resultaat:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

En hier is een voorbeeld van het gebruik van de functie binnen de SELECT verklaring:

DECLARE @thedatetime datetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';

Resultaat:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

Een belangrijk punt over de TODATETIMEOFFSET() functie is dat het dezelfde fractionele precisie gebruikt als het datum/tijd-argument dat eraan wordt doorgegeven. In dit geval is het een datetime argument, dus het heeft een schaal van 3 (d.w.z. 3 fractionele seconden). Dit kan al dan niet een probleem voor u zijn. Als dat zo is, kun je het altijd converteren naar een datetimeoffset geef eerst die geconverteerde waarde door aan TODATETIMEOFFSET() .

Voorbeeld:

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

Resultaat (met verticale uitvoer):

datetime       | 2025-05-21 10:15:30.127
datetimeoffset | 2025-05-21 10:15:30.1266667 +00:00
Modified       | 2025-05-21 10:15:30.1266667 +07:00

  1. Zoek laatste rij in groep op query-SQL Server

  2. Hoe retourneer ik een jsonb-array en een array met objecten uit mijn gegevens?

  3. Afbeelding direct in database opslaan of als base64-gegevens?

  4. Selecteer n willekeurige rijen uit de SQL Server-tabel