sql >> Databasteknik >  >> RDS >> Sqlserver

Exempel på att konvertera "tid" till "datumtid" i SQL Server (T-SQL)

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

När du konverterar en tid värde till datetime , extra information läggs till värdet. Detta beror på att datetime datatypen innehåller information om både datum och tid. tiden datatyp, å andra sidan, innehåller endast tidsinformation. Därför läggs datuminformation till värdet när du utför en sådan konvertering. Specifikt är datumet satt till "1900-01-01".

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 datumtid .

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

Resultat:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

När du konverterar från tid till datumtid , är datumkomponenten inställd på 1900-01-01 .

Observera också att själva tidsvärdet presenteras på olika sätt för båda dessa datatyper. tiden datatypen lägger till en nolla i slutet (eftersom den har en högre precision – dess standardskala är 7). Å andra sidan, datetime värden använder en lägre skala och avrundas till steg om 0,000, 0,003 eller 0,007 sekunder. Om du tycker att detta är problematiskt kan du överväga att konvertera till datetime2 istället.

Exempel 2 – Lägre precision/skala

I föregående exempel, tiden värde hade en högre bråksekundersprecision än datetime värde. Detta beror på att den använder en standardskala på 7. Men vi kan ändra detta till ett lägre värde om det behövs.

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. Vi kan specificera skalan genom att lägga till ett nummer inom parentes till datatypen.

Här är vad som händer om jag uttryckligen ställer in tiden värde för att ha ett lägre skala än datetime värde.

DECLARE @thetime time(0)
SET @thetime = '23:15:59.004007'
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime) AS 'datetime';

Resultat:

+----------+-------------------------+
| time     | datetime                |
|----------+-------------------------|
| 23:15:59 | 1900-01-01 23:15:59.000 |
+----------+-------------------------+

Exempel 3 – Explicit konvertering med CONVERT()

Detta är samma som det första exemplet, förutom att den här gången använder jag CONVERT() funktion istället för CAST() .

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

Resultat:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

Exempel 4 – Implicit konvertering

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

DECLARE @thetime time, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Resultat:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

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 datumtid 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, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SET @thedatetime = DATEADD(year, 120, @thedatetime)
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Resultat:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 2020-01-01 23:15:59.003 |
+------------------+-------------------------+

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


  1. SQL Server på Linux

  2. Hur man formaterar en Datetime i SQLite

  3. Använd funktionen Max() för att välja gruppvärden

  4. Hur man använder främmande nyckel i oracle