sql >> Database teknologi >  >> RDS >> Sqlserver

Eksempler på konvertering af 'tid' til 'datetime' i SQL Server (T-SQL)

Denne artikel indeholder eksempler på konvertering af en tid værdi til en datotid værdi i SQL Server.

Når du konverterer en tid værdi til datetime , tilføjes ekstra information til værdien. Dette skyldes, at datetime datatypen indeholder både dato- og tidsinformation. tidspunktet datatype indeholder på den anden side kun tidsinformation. Derfor tilføjes datooplysninger til værdien, når du udfører en sådan konvertering. Konkret er datoen sat til '1900-01-01'.

Eksempel 1 – Eksplicit konvertering ved hjælp af CAST()

Her er et eksempel på en eksplicit konvertering. I dette tilfælde bruger jeg CAST() funktion direkte i SELECT sætning for eksplicit at konvertere fra tid til datotid .

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 konverterer fra tid til datotid , er datokomponenten indstillet til 1900-01-01 .

Bemærk også, at selve tidsværdien præsenteres forskelligt på tværs af begge disse datatyper. tidspunktet datatypen tilføjer et nul til slutningen (fordi den har en højere præcision – dens standardskala er 7). På den anden side, datetime værdier bruger en lavere skala og er afrundet til trin på 0,000, 003 eller 0,007 sekunder. Hvis du finder dette problematisk, kan du overveje at konvertere til datetime2 i stedet.

Eksempel 2 – Lavere præcision/skala

I det foregående eksempel er tiden værdien havde en højere brøksekunders præcision end datetime værdi. Dette skyldes, at den bruger en standardskala på 7. Men vi kan ændre denne til en lavere værdi, hvis det kræves.

Bare for at være klar, skaler er antallet af cifre til højre for decimaltegnet i et tal. Nøjagtighed er det samlede antal cifre i tallet. Vi kan angive skalaen ved at tilføje et tal i parentes til datatypen.

Her er, hvad der sker, hvis jeg udtrykkeligt indstiller tidspunktet værdi for at have en lavere skala end datetime værdi.

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

Eksempel 3 – Eksplicit konvertering ved hjælp af CONVERT()

Dette er det samme som det første eksempel, bortset fra at denne gang bruger jeg CONVERT() funktion i stedet for 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 |
+------------------+-------------------------+

Eksempel 4 – Implicit konvertering

Her er et eksempel på at gøre det samme, men ved at bruge en implicit typekonvertering.

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 det samme resultat, uanset om det er en eksplicit eller implicit konvertering.

Dette er en implicit konvertering, fordi vi ikke bruger en konverteringsfunktion til eksplicit at konvertere den. Vi tildeler simpelthen værdien fra en variabel af én datatype til en variabel af en anden datatype. I dette tilfælde udfører SQL Server en implicit konvertering bag kulisserne, når vi forsøger at tildele tidspunktet værdi til en datotid variabel.

Eksempel 5 – Skift datoen

Hvis du har brug for at ændre datoen (men beholde den samme tid), kan du bruge DATEADD() fungere.

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 dette tilfælde tilføjer jeg 120 til årsværdien, hvilket bringer den til 2020.


  1. Kører Vitess og MySQL med ClusterControl

  2. MySQL og JDBC med rewriteBatchedStatements=true

  3. SQL Server:Indekskolonner brugt i lignende?

  4. Hvordan kan jeg gruppere efter dato og klokkeslæt uden at tage tid i betragtning