sql >> Databasteknik >  >> RDS >> Sqlserver

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

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

När du konverterar en tid värde till smalldatetime , är datumet satt till "1900-01-01", och tim- och minutvärdena avrundas uppåt. Sekunderna och bråksekunderna är inställda på 0.

Exempel 1 – 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 från tid till smalldatetime .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Resultat:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Så en datumdel läggs till och sätts till "1900-01-01", och i det här fallet avrundas minutvärdena uppåt och sekunderna sätts till 0.

Microsofts dokumentation anger att bråksekunderna också är inställda på noll, men smalldatetime datatypen inkluderar inte bråkdelar i alla fall.

Förresten, när du använder smalldatetime datatyp, är komponenten sekunder alltid inställd på 0.

Exempel 2 – Avrunda timmen uppåt

Här är ett exempel på timmen som avrundas uppåt:

DECLARE @thetime time(0);
SET @thetime = '10:59:59';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Resultat:

+----------+---------------------+
| time     | smalldatetime       |
|----------+---------------------|
| 10:59:59 | 1900-01-01 11:00:00 |
+----------+---------------------+

I det här fallet angav jag också en skala på 0 för tidsvärdet, men detta påverkar inte resultatet.

Bara för att vara tydlig, skala är antalet siffror till höger om decimalkomma i ett tal. Precision är det totala antalet siffror i numret. När vi anger en skala på 0 betyder det att bråkdelen inte ingår.

Exempel 3 – Explicit konvertering med CONVERT()

Här är ett exempel med CONVERT() funktion istället för CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(smalldatetime, @thetime) AS 'smalldatetime';

Resultat:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Exempel 4 – Implicit konvertering

Här är ett exempel på att göra samma sak, men att använda en implicit typkonvertering.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultat:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Så vi får samma resultat, oavsett om det är en explicit eller implicit konvertering.

Detta är en implicit konvertering eftersom vi inte använder en konverteringsfunktion för att explicit konvertera den. Vi tilldelar helt enkelt värdet från en variabel av en datatyp till en variabel av en annan datatyp. I det här fallet utför SQL Server en implicit konvertering bakom kulisserna när vi försöker tilldela tiden värde till en smalldatetime variabel.

Exempel 5 – Ändra datum

Om du behöver ändra datumet (men behålla samma tid), kan du använda DATEADD() fungera.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultat:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1985-01-01 23:16:00 |
+------------------+---------------------+

I det här fallet lägger jag till 85 till årsvärdet, vilket leder till 1985.

Var dock medveten om att smalldatetime stöder ett mycket snävt datumintervall (1900-01-01 till 2079-06-06), så att lägga till för mycket till året kan resultera i ett överflödesfel som det nedan:

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultat:

Adding a value to a 'smalldatetime' column caused an overflow.

  1. SQL DROP COLUMN för nybörjare

  2. Ladda data dynamiskt på div scroll med php, mysql, jquery och ajax

  3. En datamodell för djurvård

  4. Hur man kör en utlösare endast när en specifik kolumn uppdateras (SQL-server)