sql >> Database teknologi >  >> RDS >> Sqlserver

Konverter 'datetime2' til 'time' i SQL Server (T-SQL-eksempler)

Denne artikel indeholder eksempler på konvertering af en datetime2 værdi til en tid værdi i SQL Server.

En af fordelene ved at konvertere en datetime2 værdi til tid er, at du reducerer lagerstørrelsen fra mellem 6 og 8 bytes, ned til mellem 3 og 5 bytes (afhængigt af den præcision, hver datatype har tildelt den). Strengt taget bruges 1 ekstra byte til at gemme præcisionen for disse datatyper, så du bør tilføje 1 byte til disse mængder.

Det er klart, at du mister datodelen under konverteringen, men du ville ikke foretage denne konvertering, hvis du havde brug for at beholde datodelen.

Når du konverterer en datetime2 værdi til tid , kun tidsdelen af ​​værdien kopieres. Det nøjagtige resultat vil afhænge af brøksekunders præcision, der er tildelt hver type. Når tidspunktet præcisionen er mindre end datetime2 præcision rundes brøksekunderne op, så de passer til tiden præcision.

Med hensyn til præcision giver begge datatyper dig mulighed for at angive en skala fra 0 decimaler op til 7. Derfor har du mulighed for at udføre konverteringen uden at miste brøkdele af sekunder eller få resultatet rundet op.

Eksempel 1 – Implicit konvertering

Her er et eksempel på en implicit konvertering mellem datetime2 og tid .

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

Resultat:

+-------------------------------------+---------------- --+| datetime2 | tid ||-------------------------------------+---------------- -|| 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 |+------------------------------+------------ -----+

Dette er en implicit konvertering, fordi vi ikke bruger en konverteringsfunktion (som dem nedenfor) til eksplicit at konvertere den. I dette tilfælde udfører SQL Server en implicit konvertering bag kulisserne, når vi forsøger at tildele datetime2 værdi til en tid variabel.

Det mest tydelige ved dette resultat er, at tiden værdien inkluderer ikke datoen. Dette er forventeligt, fordi tiden datatypen er udelukkende til lagring af tidsværdier, ikke datoværdier.

Også i dette eksempel bruger begge datatyper deres standardpræcision (som er en skala fra 7). Det betyder, at tiden værdien ender med samme præcision som datetime2 værdi. Grunden til, at jeg ved, at de bruger deres standardpræcision, er, fordi jeg ikke specificerede en brøksekundskala, da jeg erklærede dem.

Eksempel 2 – Konverter til en højere præcision

I dette eksempel er tiden variabel bruger højere præcision til datetime2 variabel.

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

Resultat:

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

I dette tilfælde datetime2 variabel bruger en skala fra 4 og tiden variabel bruger 7.

Dette resulterer i datetime2 runder brøksekunderne op, så vi får 1235 i stedet for 1234 . Det betyder også, at når vi konverterer det til tid , ender værdien med 3 efterfølgende nuller (fordi vi har angivet en skala på 7). Det betyder også, at tiden værdiens lagerstørrelse er 5 bytes (6 inklusive præcision) sammenlignet med 4 bytes (5 inklusive præcision), hvis vi havde givet den en skala på 4.

Eksempel 3 – Konverter til en lavere præcision

I dette eksempel er tiden variabel bruger lavere præcision til 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 'tid';

Resultat:

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

Så i dette tilfælde tid ’s skala er reduceret til 0, hvilket betyder, at der ikke indgår brøksekunder i resultatet. Sekunderne rundes også op i overensstemmelse hermed.

tidspunktet værdi bruger 4 bytes lagerplads (inklusive præcision) sammenlignet med 9 bytes for datetime2 værdi (og sammenlignet med 6 bytes for tiden værdi i det foregående eksempel).

Eksempel 4 – Eksplicit konvertering ved hjælp af CAST()

Her er et eksempel på en eksplicit konvertering. I dette tilfælde bruger jeg CAST() funktion direkte i SELECT sætning til eksplicit at konvertere mellem datetime2 og tid .

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)';

Resultat:

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

Eksempel 5 – Eksplicit konvertering ved hjælp af CONVERT()

Her er et eksempel på en eksplicit konvertering ved hjælp af CONVERT() funktion i stedet for CAST() .

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

Resultat:

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

  1. Løsning af en kommunikationsforbindelsesfejl med JDBC og MySQL

  2. REGEXP_REPLACE() Funktion i Oracle

  3. Sådan deaktiveres MySQL Strict Mode

  4. Aktiver SQL Server Agent via SSMS