sql >> Database >  >> RDS >> Sqlserver

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

Als je een datetimeoffset . hebt waarde, maar u hebt het tijd- en tijdzone-offsetgedeelte niet nodig, converteer het naar datum 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 datum 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 (plus 1 byte om de precisie op te slaan), afhankelijk van de precisie die wordt gebruikt. De nauwkeurigheid is 100 nanoseconden.

De datum gegevenstype daarentegen bevat alleen de datum. Het omvat niet de tijd, en het heeft een nauwkeurigheid van 1 dag. Het gebruikt 3 bytes voor opslag.

Wanneer u een datetimeoffset . converteert waarde tot een datum gegevenstype, verliest u het tijdsgedeelte (inclusief de tijdzone-offset). U verkleint echter ook de opslagcapaciteit tot een vaste 3 bytes. Natuurlijk zou je deze conversie alleen doen als je het tijdsgedeelte en de tijdzone-offset niet nodig hebt.

Voorbeeld 1 – Impliciete conversie

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

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

Resultaat:

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

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 datum variabel.

Hier kunnen we zien dat de datum waarde bevat alleen de datum (zonder de tijdcomponent). De tijdcomponent, inclusief de tijdzone-offset, is uit de waarde verwijderd.

In dit voorbeeld is de datetimeoffset waarde gebruikt de standaardprecisie (wat resulteert in 7 decimalen). Dit resulteert in het datatype dat 10 bytes gebruikt (eigenlijk 11 bytes als je de extra byte meetelt die de precisie opslaat). De datum waarde gebruikt slechts 3 bytes.

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

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

Resultaat:

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

Voorbeeld 3 – 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(date, @thedatetimeoffset) AS 'date';

Resultaat:

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

  1. SQL Alle records ouder dan 30 dagen ophalen

  2. Maximale grootte voor een SQL Server-query? IN clausule? Is er een betere aanpak?

  3. MySQL op Azure Performance Benchmark – ScaleGrid vs. Azure Database

  4. GROUP_CONCAT met limiet