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

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

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

Når du konverterer en smalldatetime værdi til tid , mister du datoen. Timerne, minutterne og sekunderne kopieres. Brøksekunderne er sat til 0.

smalldatetime datatypen inkluderer både dato og klokkeslæt. Tiden har dog ingen brøkdele af sekunder, og dens sekundkomponent er altid sat til nul (:00). Dens nøjagtighed er til nærmeste minut. Dens lagerstørrelse er 4 bytes.

tidspunktet datatype på den anden side, inkluderer kun tiden. Det giver dig dog mulighed for at angive en brøksekunders præcision fra 0 til 7. Dette opnås ved at bruge tiden(n ) syntaks, hvor n er skalaen fra 0 til 7. Hvis du ikke angiver dette, vil den bruge 7 (standard), som giver en nøjagtighed på 100 nanosekunder. Hvis du angiver nul (0 ), vil dens nøjagtighed være til nærmeste sekund. Dens lagerstørrelse vil være enten 3, 4 eller 5 bytes (plus 1 byte til at gemme præcisionen), afhængigt af brøksekunders præcision.

Eksempel 1 – Implicit konvertering

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Resultat:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:16:00 |
+---------------------+----------+

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 smalldatetime værdi til en tid variabel.

Det mest åbenlyse 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.

Hvad er ikke indlysende (i hvert fald med mit eksempel) er, at tidsværdien faktisk kan klare en del af en brøkdel af sekunder. Mit system viser ikke brøksekunderne her, men det næste eksempel viser, at det faktisk har en brøksekunders præcision på 7.

Hvis du ser godt efter, vil du også se, at smalldatetime værdi rundede minutterne op fra den faktiske værdi, jeg forsøgte at tildele den. Dette afspejler smalldatetimes relativt lave præcision datatype. Dens præcision er til nærmeste minut. Den åbenlyse konsekvens af dette er, at når vi til sidst tildeler dens værdi til tiden datatype, er det den afrundede værdi, der er tildelt - ikke den oprindelige værdi, jeg forsøgte at tildele. Hvis vi havde tildelt startværdien direkte til tidspunktet variabel, ville vi have fået en mere præcis værdi (selvom vi havde angivet en skala på 0).

Her er hvad jeg mener:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Resultat:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:15:30 |
+---------------------+----------+

Eksempel 2 – Tilføjelse af brøksekunder

smalldatetime datatypen har ikke en brøkdel af sekunder, men i vores første eksempel er tiden værdi har en brøksekunders præcision på 7 (selvom den faktisk ikke viser nogen decimaler). Jeg kender dens præcision, fordi jeg ikke specificerede en skala, da jeg deklarerede den, derfor bruger den sin standardskala på 7.

Her er et eksempel for at bekræfte, at tidspunktet værdi kan faktisk understøtte en brøkdel:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'Original time',
  DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';

Resultat:

+---------------------+-----------------+------------------+
| smalldatetime       | Original time   | Modified time    |
|---------------------+-----------------+------------------|
| 2025-05-21 10:16:00 | 10:16:00        | 10:16:00.1234567 |
+---------------------+-----------------+------------------+

Bemærk, at når tidspunktet værdi har en skala på 7, den har en lagerstørrelse på 5 bytes. Derfor har den højere lagerkrav end smalldatetime type (som kun bruger 4 bytes).

Eksempel 3 – 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 smalldatetime og tid .

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

Resultat:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

I dette eksempel satte jeg skalaen til 0.

Eksempel 4 – 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() .

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

Resultat:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

  1. Grundlæggende om tabeludtryk, del 4 – Afledte tabeller, optimeringsovervejelser, fortsat

  2. Sådan rettes fejlmeddelelse 7325 i SQL Server:"Objekter, der afslører kolonner med CLR-typer, er ikke tilladt i distribuerede forespørgsler"

  3. Sådan oprettes tjekbegrænsning på enkelt kolonne i SQL Server - SQL Server / TSQL vejledning del 83

  4. SQL Inner join på udvalgte sætninger