sql >> Databasteknik >  >> RDS >> Sqlserver

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

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

När du konverterar en smalldatetime värde till tid , tappar du datumet. Timmarna, minuterna och sekunderna kopieras. Bråksekunderna sätts till 0.

smalldatetime datatypen inkluderar både datum och tid. Tiden har dock inga bråkdelar av sekunder, och dess sekundkomponent är alltid noll (:00). Dess noggrannhet är till närmaste minut. Dess lagringsstorlek är 4 byte.

tiden datatyp å andra sidan, inkluderar bara tiden. Det låter dig dock ange en bråkdelssekunderprecision från 0 till 7. Detta uppnås genom att använda time(n ) syntax, där n är skalan från 0 till 7. Om du inte anger detta kommer den att använda 7 (standard), vilket ger en noggrannhet på 100 nanosekunder. Om du anger noll (0 ), kommer dess noggrannhet att vara till närmaste sekund. Dess lagringsstorlek kommer att vara antingen 3, 4 eller 5 byte (plus 1 byte för att lagra precisionen), beroende på bråksekundersprecisionen.

Exempel 1 – Implicit konvertering

Här är ett exempel på en implicit konvertering mellan datetime och 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 |
+---------------------+----------+

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 tid variabel.

Det mest uppenbara med detta resultat är att tiden värdet inkluderar inte datumet. Detta är att vänta, eftersom tiden datatypen är endast till för att lagra tidsvärden, inte datumvärden.

Vad är inte uppenbart (åtminstone med mitt exempel) är att tidsvärdet faktiskt kan hantera en bråkdelssekundsdel. Mitt system visar inte bråksekunderna här, men nästa exempel visar att det faktiskt har en bråksekundersprecision på 7.

Om du tittar noga ser du att smalldatetime värdet avrundade minuterna uppåt från det faktiska värdet jag försökte tilldela den. Detta återspeglar den relativt låga precisionen för smalldatetime data typ. Dess precision är till närmaste minut. Den uppenbara konsekvensen av detta är att när vi så småningom tilldelar dess värde till tiden datatyp, det är det avrundade värdet som tilldelas – inte det initiala värdet jag försökte tilldela. Om vi ​​hade tilldelat initialvärdet direkt till tiden variabel, skulle vi ha fått ett mer exakt värde (även om vi hade angett en skala på 0).

Så här menar jag:

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 |
+---------------------+----------+

Exempel 2 – Lägga till bråkdelar av sekunder

smalldatetime datatypen har inte en bråkdelssekundersdel, men i vårt första exempel är tiden värdet har en precision på bråkdels sekunder på 7 (även om det faktiskt inte visar några decimaler). Jag vet dess precision eftersom jag inte angav en skala när jag deklarerade den, därför använder den standardskalan på 7.

Här är ett exempel för att bekräfta att tiden värde kan faktiskt stödja 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 |
+---------------------+-----------------+------------------+

Observera att när tiden värdet har en skala på 7, det har en lagringsstorlek på 5 byte. Därför har den högre lagringskrav än smalldatetime typ (som bara använder 4 byte).

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 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 det här exemplet satte jag skalan till 0.

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.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. Hur gör man arvsmodellering i relationsdatabaser?

  2. SINH() Funktion i Oracle

  3. Webbseminarium:Banking on Postgres – Finansiella tillämpningsöverväganden [Uppföljning]

  4. SQLite VISA TABELLER Motsvarande