sql >> Databasteknik >  >> RDS >> Sqlserver

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

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

smalldatetime datatypen har inga bråkdelar av sekunder, och dess sekundkomponent är alltid noll (:00). Dess noggrannhet är till närmaste minut.

datetime2 datatyp å andra sidan, låter dig ange en bråkdelssekunderprecision från 0 till 7. Om du inte anger detta kommer den att använda 7 (standard). Om du anger noll (0 ), kommer dess noggrannhet att vara till närmaste sekund.

När du konverterar en smalldatetime värde till datetime2 , timmarna och minuterna kopieras. Sekunderna och bråksekunderna är inställda på 0.

Exempel 1 – Implicit konvertering

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

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

Resultat:

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

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 smalldatetime värde till en datetime2 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.

I det här fallet, datetime2 värde använder en precision på 7. Detta beror på att 7 är standardvärdet. Jag angav ingen precision och därför användes standardvärdet. Detta resulterar i att 7 nollor används i bråkdelen.

Exempel 2 – Ta bort bråkdelen

Du kan ta bort bråkdelssekunderna om det behövs. För att göra detta, använd helt enkelt datetime2(0) när variabeln deklareras.

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

Resultat:

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

Så i det här fallet returnerar båda datatyperna samma värde. Skillnaden är dock att datetime2 har förmågan att ge exakthet till tvåan (jämfört med smalldatetime noggrannhet på minut).

Exempel:

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  DATEADD(second, 30, @thesmalldatetime) AS 'smalldatetime',
  DATEADD(second, 30, @thedatetime2) AS 'datetime2';

Resultat:

+---------------------+---------------------+
| smalldatetime       | datetime2           |
|---------------------+---------------------|
| 2025-05-21 10:17:00 | 2025-05-21 10:16:30 |
+---------------------+---------------------+

I det här exemplet använde jag DATEADD() funktion för att lägga till 30 sekunder till varje värde. Varje datatyp returnerar dock olika resultat. datetime2 datatyp hedrar sekunddelen och ger det korrekta resultatet med 100 % noggrannhet. smalldatetime typ å andra sidan, avrundas uppåt till närmaste minut (medan sekunddelen förblir noll).

Exempel 3 – 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 smalldatetime och datetime2 .

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

Resultat:

+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

Exempel 4 – Explicit konvertering med CONVERT()

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

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

Resultat:

+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

  1. Icke-nummertecken som returnerar positivt när ISNUMERIC() används i SQL Server

  2. 6 vanliga felscenarier för MySQL och MariaDB, och hur man åtgärdar dem

  3. Hur förfinar man utdata som kommer från SELECT-frågan i kommandotolken?

  4. SQL Välj Kommande födelsedagar