sql >> Database >  >> RDS >> Sqlserver

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

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

Wanneer u een smalldatetime . converteert waarde naar datetimeoffset , de smalldatetime waarde wordt gekopieerd naar de datetimeoffset waarde. De fractionele seconden zijn ingesteld op 0 en de tijdzone-offset is ingesteld op +00:0.

De smalldatetime gegevenstype heeft geen fractionele seconden en de secondencomponent is altijd ingesteld op nul (:00). De nauwkeurigheid is tot op de minuut nauwkeurig.

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, smalldatetime heeft geen tijdzonebewustzijn, dus er zijn geen bestaande waarden om te behouden. In dit geval wordt de tijdzone-offset 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. Zie echter hieronder voor mijn opmerkingen en enkele voorbeelden met betrekking tot deze optie.

Voorbeeld 1 – Impliciete conversie

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Resultaat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16: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 smalldatetime toe te wijzen waarde naar een datetimeoffset variabel.

We kunnen zien dat de datetimeoffset variabele heeft een fractioneel deel ( 0000000 ), terwijl de smalldatetime waarde heeft geen fractioneel deel en de minuten werden naar boven afgerond bij het toekennen van de initiële waarde. De datetimeoffset waarde omvat ook een tijdzoneverschuiving van +00:00 .

Het gebruik van 7 fractionele seconden precisie veroorzaakt datetimeoffset om 11 bytes te gebruiken voor opslag (10 bytes om de gegevens op te slaan, 1 byte voor de precisie). Ter vergelijking:smalldatetime gebruikt slechts 4 bytes. U kunt echter de precisie van de datetimeoffset . verminderen waarde door de 7 te vervangen door een lager getal. Als je het gedeelte met breuken in zijn geheel wilt verwijderen, gebruik je gewoon datetimeoffset(0) . Als u dit doet, wordt de opslagcapaciteit teruggebracht tot 9 bytes (inclusief 1 voor de precisie).

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

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

Resultaat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Voorbeeld 3 – Expliciete conversie met CONVERT()

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

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

Resultaat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Voorbeeld 4 – De tijdzone-offset wijzigen

Het feit dat u uw smalldatetime . converteert waarden naar datetimeoffset betekent dat je het waarschijnlijk doet voor de tijdzone-offset. En het is waarschijnlijk dat u deze wilt instellen op een andere offset dan +00:00 (de standaard offset).

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

U kunt deze functie ook gebruiken om de originele smalldatetime . 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 @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset';

Resultaat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
+---------------------+------------------------------------+

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

DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';

Resultaat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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 smalldatetime argument, dat geen fractionele seconden heeft.

Mijn systeem retourneert nullen met datetimeoffset fractioneel deel, maar je zou zoiets als dit kunnen zien:

+---------------------+----------------------------+
| smalldatetime       | datetimeoffset             |
|---------------------+----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 |
+---------------------+----------------------------+

Hoe dan ook, u kunt nog steeds optimaal profiteren van de datetimeoffset precisie van het gegevenstype als u de waarde later moet wijzigen.

Hier is een voorbeeld dat de DATEADD() . gebruikt functie om de fractionele seconden te wijzigen nadat de conversie al is uitgevoerd.

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset',
  DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';

Resultaat (met verticale uitvoer):

smalldatetime  | 2025-05-21 10:16:00
datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00
Modified       | 2025-05-21 10:16:00.1234567 +07:00

  1. Volgnummer toevoegen voor elk element in een groep met behulp van een SQL-query zonder tijdelijke tabellen

  2. PostgreSQL-schema's / naamruimten met Django

  3. MAAK Oracle-procedure

  4. Jenkins gebruiken met Kubernetes AWS, deel 2