sql >> Database >  >> RDS >> Sqlserver

Voorbeelden van het converteren van 'date' naar 'datetimeoffset' in SQL Server (T-SQL)

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

Wanneer u een datum converteert waarde naar datetimeoffset , wordt er extra informatie aan de waarde toegevoegd. Dit komt omdat de datetimeoffset gegevenstype bevat zowel datum- als tijdinformatie, evenals de tijdverschuivingsinformatie. Met andere woorden, de datetimeoffset gegevenstype definieert een datum die wordt gecombineerd met een tijd van een dag die bekend is met de tijdzone en is gebaseerd op een 24-uurs klok. De datum gegevenstype daarentegen bevat alleen datuminformatie.

Wanneer we converteren vanaf datum naar datetimeoffset , wordt de tijd (en tijdzone-offset) automatisch bij de waarde opgeteld. U kunt de waarde echter altijd wijzigen indien nodig (inclusief de tijdzone-offset).

De datetimeoffset Met het gegevenstype kunt u ook de precisie van fractionele seconden specificeren. Als u dit niet opgeeft, gebruikt het een schaal van 7. Dit betekent dat het 7 cijfers aan de rechterkant van de komma zal bevatten.

Voorbeeld 1 – Impliciete conversie

Hier is een voorbeeld van een impliciete conversie tussen datum en datetimeoffset .

DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7)
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Resultaat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +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 datum toe te wijzen waarde naar een datetimeoffset variabel.

We kunnen zien dat de datum variabele bevat alleen datuminformatie, terwijl de datetimeoffset variabele bevat datum-, tijd- en tijdzoneverschuivingsinformatie.

Wanneer u converteert tussen datum en datetimeoffset(7) (d.w.z. met een schaal van 7), wordt de tijdcomponent ingesteld op 00:00:00.0000000 +00:00 . Dit is ook de standaardwaarde, dus u kunt de precisiewaarde weglaten en er wordt een schaal van 7 gebruikt (wat resulteert in een nauwkeurigheid van 34). U kunt de precisie verminderen als u dat wilt. Het verminderen van de precisie kan ook de hoeveelheid ruimte verminderen die nodig is om de waarde op te slaan.

Voor alle duidelijkheid:schaal is het aantal cijfers rechts van de komma in een getal. Precisie is het totale aantal cijfers in het getal.

Voorbeeld 2 – 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 datum en datetimeoffset .

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CAST(@thedate AS datetimeoffset) AS 'datetimeoffset';

Resultaat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 |
+------------+------------------------------------+

We krijgen dus hetzelfde resultaat als de impliciete conversie.

We kunnen de tijd ook als volgt aanpassen:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 7, CAST(@thedate AS datetimeoffset)) AS 'datetimeoffset';

Resultaat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Merk op dat u de DATEADD() . niet kunt gebruiken functie om de tijdverschuivingscomponent te wijzigen. Maar maak je geen zorgen, er is is een manier om het aan te passen (lees verder om erachter te komen hoe).

Voorbeeld 3 – Expliciete conversie met CONVERT()

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

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetimeoffset, @thedate) AS 'datetimeoffset';

Resultaat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 |
+------------+------------------------------------+

En de tijd aanpassen:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 7, CONVERT(datetimeoffset, @thedate)) AS 'datetimeoffset';

Resultaat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Voorbeeld 4 – De tijdverschuiving wijzigen

In de vorige voorbeelden gebruikten we de DATEADD() functie om de tijdwaarde te wijzigen. Deze functie kan worden gebruikt om elk deel van de datum- of tijdcomponent te wijzigen, behalve de tijdverschuivingscomponent .

Als u de tijdverschuiving moet wijzigen, kunt u de TODATETIMEOFFSET() . gebruiken functie. U kunt deze functie ook gebruiken om de originele datum te converteren waarde naar een datetimeoffset waarde. Deze functie accepteert een datumwaarde (die kan worden omgezet in een datetime2 waarde) en een offsetwaarde.

Hier is een voorbeeld:

DECLARE @thedate date, @thedatetimeoffset datetimeoffset
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedate, '+07:00')
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Resultaat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

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

DECLARE @thedate date = '2020-12-01'
SELECT 
  @thedate AS 'date',
  TODATETIMEOFFSET(@thedate, '+07:00') AS 'datetimeoffset';

Resultaat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

De TODATETIMEOFFSET() functie accepteert ook een datetimeoffset waarde als de eerste parameter, dus je kunt het ook gebruiken om bestaande datetimeoffset te wijzigen waarden indien nodig.

Voorbeeld:

DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7)
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

Resultaat:

+------------+------------------------------------+------------------------------------+
| date       | datetimeoffset                     | Modified                           |
|------------+------------------------------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+------------------------------------+

  1. Simple Encrypted Arithmetic Library (SEAL) en de variabele seal::Ciphertext

  2. Waarom gegevensback-ups belangrijk zijn voor uw organisatie

  3. Zoek het verschil tussen tijdstempels in seconden in PostgreSQL

  4. Transformationele verhalen op de MariaDB OpenWorks-conferentie