sql >> Database >  >> RDS >> Sqlserver

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

Als je een datetimeoffset . hebt waarde, maar u hebt het gedeelte voor datum- en tijdzone-offset niet nodig, maar converteer het naar tijd bespaart u veel opslagruimte (terwijl u onnodige details uit de waarde verwijdert). Dit artikel bevat voorbeelden van het converteren van een datetimeoffset waarde tot een tijd waarde in SQL Server.

De datetimeoffset gegevenstype omvat de datum en tijd met een tijdzoneverschuiving. Het heeft ook een deel van een fractie van een seconde tussen 0 en 7 (dit hangt af van het aantal seconden dat eraan is toegewezen). Dit wordt gedaan met behulp van de datetimeoffset(n) syntaxis. Als u dit niet opgeeft, wordt 7 gebruikt (de standaardinstelling). De opslaggrootte van dit gegevenstype is 8, 9 of 10 bytes, afhankelijk van de nauwkeurigheid die wordt gebruikt. De nauwkeurigheid is 100 nanoseconden.

De tijd gegevenstype daarentegen bevat alleen de tijd. Het bevat niet de datum en het bevat niet de tijdzone-offset. Echter, vergelijkbaar met datetimeoffset het stelt je ook in staat om een ​​fractie van een seconde tussen 0 en 7 te specificeren (met behulp van de time(n) syntaxis). Het gebruikt 3, 4 of 5 bytes, afhankelijk van de precisie.

Wanneer u een datetimeoffset . converteert waarde tot een tijd gegevenstype, verliest u het datumgedeelte. U verliest ook de tijdzone-offset. U verkleint echter ook de opslagcapaciteit van 8 tot 10 bytes tot 3, 4 of 5 bytes. U zou deze conversie echter alleen doen als u het datumgedeelte of de tijdzone-offset niet nodig heeft.

Houd er rekening mee dat de hier vermelde opslagbedragen de bedragen zijn die worden vermeld in de Microsoft-documentatie. Deze gegevenstypen gebruiken echter ook 1 byte om de precisie op te slaan. Daarom moet u 1 byte toevoegen aan de hier vermelde bedragen.

Voorbeeld 1 – Impliciete conversie

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

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thetime time;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Resultaat:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

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 datetimeoffset toe te wijzen waarde tot een tijd variabel.

Hier kunnen we zien dat de tijd waarde omvat alleen de tijd (zonder de datumcomponent). De componenten voor datum- en tijdzone-offset zijn uit de waarde verwijderd.

In dit voorbeeld gebruiken beide gegevenstypen de standaardprecisie (wat resulteert in 7 decimalen). Dit resulteert in de datetimeoffset waarde met 10 bytes en de tijd waarde met behulp van 5 bytes.

Voorbeeld 2 – Precisie

Het exacte resultaat hangt af van de precisie-instellingen voor elk gegevenstype. In het volgende voorbeeld is de tijd waarde gebruikt een lagere precisie dan de originele datetimeoffset waarde:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Resultaat:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 |
+------------------------------------+------------------+

Mijn systeem geeft volgnullen weer, maar het punt is dat de tijd waarde heeft nu een precisie tot slechts 3 decimalen vergeleken met de 7 decimalen die de oorspronkelijke waarde gebruikt.

Het verminderen van de precisie kan ook resulteren in de tijd waarde wordt naar boven afgerond. Hier is een voorbeeld:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Resultaat:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 |
+------------------------------------+------------------+

In dit geval krijgen we een fractioneel deel van 124 in plaats van 123 , omdat het volgende cijfer 5 of hoger was.

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 datetimeoffset en tijd .

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CAST(@thedatetimeoffset AS time) AS 'time'; 

Resultaat:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

Voorbeeld 4 – Expliciete conversie met CONVERT()

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

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(time, @thedatetimeoffset) AS 'time'; 

Resultaat:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

  1. Oracle PL/SQL-verzamelingen - Geneste tabel in de database maken

  2. Complexe Postgres-query

  3. Postgresql trigger invoegen om waarde in te stellen

  4. hoe de wf_java_deferred-wachtrij opnieuw op te bouwen