sql >> Database >  >> RDS >> Sqlserver

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

Dit artikel bevat voorbeelden van het converteren van een datetime2 waarde tot een tijd waarde in SQL Server.

Een van de voordelen van het converteren van een datetime2 waarde tot tijd is dat u de opslaggrootte verkleint van tussen 6 en 8 bytes, tot tussen 3 en 5 bytes (afhankelijk van de precisie die elk gegevenstype eraan heeft toegewezen). Strikt genomen wordt 1 extra byte gebruikt om de precisie voor deze gegevenstypen op te slaan, dus u moet 1 byte aan deze hoeveelheden toevoegen.

Uiteraard verliest u het datumgedeelte tijdens de conversie, maar u zou deze conversie niet doen als u het datumgedeelte zou moeten behouden.

Wanneer u een datetime2 . converteert waarde tot tijd , wordt alleen het tijdsgedeelte van de waarde gekopieerd. Het exacte resultaat hangt af van de precisie van een fractie van een seconde die aan elk type is toegewezen. Wanneer de tijd precisie is minder dan de datetime2 precisie, de fractionele seconden worden naar boven afgerond zodat ze passen bij de tijd precisie.

Met betrekking tot precisie kunt u met beide gegevenstypen een schaal opgeven van 0 decimalen tot 7. Daarom heeft u de mogelijkheid om de conversie uit te voeren zonder fracties van seconden te verliezen of het resultaat naar boven af ​​te ronden.

Voorbeeld 1 – Impliciete conversie

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

DECLARE 
  @thedatetime2 datetime2, 
  @thetime time;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thetime AS 'time';

Resultaat:

+-----------------------------+------------------+
| datetime2                   | time             |
|-----------------------------+------------------|
| 2025-05-21 10:15:30.1234567 | 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 datetime2 toe te wijzen waarde tot een tijd variabel.

Het meest opvallende aan dit resultaat is dat de tijd waarde is exclusief de datum. Dit is te verwachten, omdat de tijd gegevenstype is uitsluitend bedoeld voor het opslaan van tijdwaarden, niet voor datumwaarden.

In dit voorbeeld gebruiken beide gegevenstypen ook hun standaardprecisie (een schaal van 7). Dit betekent dat de tijd waarde eindigt met dezelfde precisie als de datetime2 waarde. De reden dat ik weet dat ze hun standaardprecisie gebruiken, is omdat ik geen fractionele secondeschaal heb opgegeven bij het declareren ervan.

Voorbeeld 2 – Converteren naar een hogere precisie

In dit voorbeeld is de tijd variabele gebruikt hogere precisie voor de datetime2 variabel.

DECLARE 
  @thedatetime2 datetime2(4), 
  @thetime time(7);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thetime AS 'time';

Resultaat:

+--------------------------+------------------+
| datetime2                | time             |
|--------------------------+------------------|
| 2025-05-21 10:15:30.1235 | 10:15:30.1235000 |
+--------------------------+------------------+

In dit geval de datetime2 variabele gebruikt een schaal van 4 en de tijd variabele gebruikt 7.

Dit resulteert in datetime2 de fractionele seconden naar boven afronden, zodat we 1235 . krijgen in plaats van 1234 . Het betekent ook dat wanneer we het converteren naar tijd , de waarde eindigt met 3 volgnullen (omdat we een schaal van 7 hebben opgegeven). Dit betekent ook dat de tijd de opslaggrootte van de waarde is 5 bytes (6 inclusief precisie) vergeleken met 4 bytes (5 inclusief precisie) als we het een schaal van 4 hadden gegeven.

Voorbeeld 3 – Converteren naar een lagere precisie

In dit voorbeeld is de tijd variabele gebruikt lagere precisie voor de datetime2 variabel.

DECLARE 
  @thedatetime2 datetime2(7), 
  @thetime time(0);
SET @thedatetime2 = '2025-05-21 10:15:30.5678912';
SET @thetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thetime AS 'time';

Resultaat:

+-----------------------------+----------+
| datetime2                   | time     |
|-----------------------------+----------|
| 2025-05-21 10:15:30.5678912 | 10:15:31 |
+-----------------------------+----------+

Dus in dit geval tijd 's schaal wordt teruggebracht tot 0, wat betekent dat er geen fractionele seconden in het resultaat worden opgenomen. Ook worden de seconden dienovereenkomstig naar boven afgerond.

De tijd waarde gebruikt 4 bytes opslag (inclusief precisie), vergeleken met 9 bytes voor de datetime2 waarde (en vergeleken met 6 bytes voor de tijd waarde in het vorige voorbeeld).

Voorbeeld 4 – 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 datetime2 en tijd .

DECLARE @thedatetime2 datetime2(3);
SET @thedatetime2 = '2025-05-21 10:15:30.123';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS time(0)) AS 'time(0)';

Resultaat:

+-------------------------+-----------+
| datetime2               | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.123 | 10:15:30  |
+-------------------------+-----------+

Voorbeeld 5 – Expliciete conversie met CONVERT()

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

DECLARE @thedatetime2 datetime2(3);
SET @thedatetime2 = '2025-05-21 10:15:30.123';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(time(0), @thedatetime2) AS 'time(0)';

Resultaat:

+-------------------------+-----------+
| datetime2               | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.123 | 10:15:30  |
+-------------------------+-----------+

  1. Geef array door aan MySQL-opgeslagen routine

  2. Microsoft Access optimaliseren met SQL Server IndyPass – 21-5-19

  3. ORA-06502:PL/SQL:numerieke of waardefout:tekenreeksbuffer te klein

  4. Django implementeren in Heroku (Psycopg2-fout)