sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera 'datetime' till 'smalldatetime' i SQL Server (T-SQL-exempel)

Den här artikeln innehåller exempel på hur du konverterar en datumtid värde till en smalldatetime värde i SQL Server.

En av fördelarna med att konvertera en datumtid värde till smalldatetime är att du minskar lagringsstorleken från 8 byte ner till 4 byte. Men du tappar precision för att göra det.

datetime datatypen inkluderar en 3-siffrig del av bråkdelssekunder. Dess noggrannhet är avrundad till steg om 0,000, 0,003 eller 0,007 sekunder.

smalldatetime datatypen å andra sidan, har inte några bråkdelar av sekunder, och dess sekundkomponent är alltid inställd på noll (:00). Dessutom har den bara en noggrannhet till närmaste minut.

När du konverterar en datumtid värde till smalldatetime , kopieras datum och del av tidsdelen. Sekundskomponenten sätts till noll (oavsett det ursprungliga värdet) och tiden avrundas till närmaste minut. Eventuella bråkdelar tas bort.

Exempel 1 – Implicit konvertering

Här är ett exempel på en implicit konvertering mellan datetime och smalldatetime .

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thesmalldatetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Resultat:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Detta är en implicit konvertering eftersom vi inte använder en konverteringsfunktion (som de nedan) för att explicit konvertera den. I det här fallet utför SQL Server en implicit konvertering bakom kulisserna när vi försöker tilldela datetime värde till en smalldatetime variabel.

I det här exemplet kan vi se att smalldatetime värdet inkluderar inte bråksekunder, sekunderna har nollställts och minuten har avrundats uppåt.

Exempel 2 – Explicit konvertering med CAST()

Här är ett exempel på en explicit konvertering. I det här fallet använder jag CAST() funktion direkt inom SELECT uttalande för att uttryckligen konvertera mellan datetime och smalldatetime .

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

Resultat:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Du kanske har märkt att jag i det här exemplet ändrade bråksekunderna när jag tilldelade det initiala värdet till @thedatetime . Men för att jag tilldelar det till en datumtid datatyp, avrundas delen av bråkdelssekunder uppåt (eftersom dess noggrannhet avrundas till steg om 0,000, 0,003 eller 0,007 sekunder). I det här fallet försöker jag tilldela en bråkdel av 125 men det avrundas uppåt till 127 .

Detta påverkar dock inte smalldatetime värde.

Exempel 3 – Explicit konvertering med CONVERT()

Här är ett exempel på en explicit konvertering med CONVERT() funktion istället för CAST() .

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

Resultat:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

  1. MySQL - FEL 1045 - Åtkomst nekad

  2. Prestandaövervakning för TimescaleDB

  3. Fatalt fel:Anrop till odefinierad funktion mysqli_result()

  4. T-SQL dynamisk pivot