Dit artikel bevat voorbeelden van het converteren van een datetimeoffset waarde voor smalldatetime in SQL-server.
Wanneer u een datetimeoffset . converteert waarde voor smalldatetime , worden de datum en uren gekopieerd. De minuten worden naar boven afgerond (afhankelijk van de secondenwaarde) en de seconden worden op 0 gezet.
De datetimeoffset gegevenstype stelt u in staat om een precisie van een fractie van een seconde van 0 tot 7 te specificeren. Dit wordt gedaan met behulp van de datetimeoffset(n)
syntaxis. Als u dit niet opgeeft, wordt 7 gebruikt (de standaardinstelling). Het heeft ook een tijdzone-offset. De opslaggrootte van dit gegevenstype is 8, 9 of 10 bytes (plus 1 byte voor de precisie), afhankelijk van de precisie die wordt gebruikt.
De smalldatetime gegevenstype daarentegen heeft geen tijdzonebewustzijn en bevat daarom geen tijdzoneverschuiving. Het heeft ook geen fractionele seconden en de secondencomponent is altijd ingesteld op nul (:00). De nauwkeurigheid is tot op de minuut nauwkeurig. De opslaggrootte van dit gegevenstype is vastgesteld op 4 bytes.
Voorbeeld 1 – Impliciete conversie
Hier is een voorbeeld van een impliciete conversie tussen datetimeoffset en smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset, @thesmalldatetime smalldatetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SET @thesmalldatetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thesmalldatetime AS 'smalldatetime';
Resultaat:
+------------------------------------+---------------------+ | datetimeoffset | smalldatetime | |------------------------------------+---------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16: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 datetimeoffset toe te wijzen waarde toe aan een smalldatetime variabel.
We kunnen zien dat de smalldatetime variabele heeft geen precisie van een fractie van een seconde en de seconden zijn op nul gezet. Ook zijn de minuten naar boven afgerond, omdat de oorspronkelijke waarde een secondewaarde van 30 had.
Een andere observatie is dat de tijdzone-offset is afgekapt - de smalldatetime gegevenstype heeft geen tijdzonebewustzijn.
Bij deze conversie is de opslaggrootte afgenomen van 10 bytes (11 bytes als je de precisie meetelt) voor datetimeoffset , tot 4 bytes voor smalldatetime .
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 smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS smalldatetime) AS 'smalldatetime';
Resultaat:
+------------------------------------+-------------------------+ | datetimeoffset | smalldatetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 | +------------------------------------+-------------------------+
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 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(smalldatetime, @thedatetimeoffset) AS 'smalldatetime';
Resultaat:
+------------------------------------+-------------------------+ | datetimeoffset | smalldatetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 | +------------------------------------+-------------------------+