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

Eksempler på konvertering af 'dato' til 'datetime2' i SQL Server (T-SQL)

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

Når du konverterer en dato værdi til datetime2 , tilføjes ekstra information til værdien. Dette skyldes, at datetime2 datatypen indeholder både dato- og tidsinformation. datoen datatype indeholder på den anden side kun datooplysninger.

datetime2 datatypen er dybest set en udvidelse af datetime datatype. Den har et større datointerval, en større standard brøkpræcision og valgfri brugerspecificeret præcision.

Under alle omstændigheder er konverteringsprocessen nøjagtig den samme uanset datatypen. Den eneste forskel er mængden af ​​information, der er tilgængelig mellem dato , datotid og datetime2 .

Eksempel 1 – Implicit konvertering

Her er et eksempel på en implicit konvertering mellem dato og datetime2 .

DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Resultat:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

Dette er en implicit konvertering, fordi vi ikke bruger en konverteringsfunktion (som dem nedenfor) til eksplicit at konvertere den. I dette tilfælde udfører SQL Server en implicit konvertering bag kulisserne, når vi forsøger at tildele datoen værdi til en datetime2 variabel.

Vi kan se, at datoen variabel indeholder kun datooplysninger, hvorimod datetime2 variabel indeholder både dato og klokkeslæt.

Desuden får vi flere tidsoplysninger, end vi ville få, hvis vi konverterede det til datetime datatype.

Når du konverterer mellem dato og datetime2 ved at bruge standardpræcisionen (7) sættes tidskomponenten til 00:00:00.0000000 (sammenlignet med 00:00:00.000 for datotid ). Du kan reducere præcisionen, hvis du foretrækker det (se nedenfor). Reduktion af præcisionen kan også reducere mængden af ​​plads, der kræves for at gemme værdien.

Grunden til, at tidskomponenten kun er nuller, er, at datoværdien ikke indeholder nogen tidsinformation, så der er ingen måde for SQL Server at vide, hvad tid du ønsker (hvis nogen).

Eksempel 2 – Rediger klokkeslættet

Hvis du har brug for at angive et klokkeslæt (men beholde den samme dato), kan du bruge DATEADD() funktion til at gøre netop det.

DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2)
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Resultat:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Eksempel 3 – 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 erklæring om eksplicit at konvertere mellem dato og datetime2 .

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CAST(@thedate AS datetime2) AS 'datetime2';

Resultat:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

Så vi får det samme resultat som den implicitte konvertering.

Vi kan også justere tiden sådan her:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';

Resultat:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

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

Her er et eksempel på en eksplicit konvertering ved hjælp af CONVERT() funktion i stedet for CAST() .

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetime2, @thedate) AS 'datetime2';

Resultat:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

Og justering af tiden:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';

Resultat:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Eksempel 5 – Præcision

datetime2 datatype giver dig mulighed for at angive præcisionen (op til standard 7). Med andre ord behøver du ikke bruge de fulde 7 cifre, hvis du ikke har brug for det.

Eksempel:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetime2(2), @thedate) AS 'datetime2(2)',
  CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';

Resultat:

+------------+------------------------+--------------------------+
| date       | datetime2(2)           | datetime2(4)             |
|------------+------------------------+--------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 |
+------------+------------------------+--------------------------+

En fordel ved at reducere præcisionen er, at det også kan reducere mængden af ​​plads, der kræves for at gemme værdien. Især 6 bytes for præcision mindre end 3, 7 bytes for præcision 3 eller 4, og al anden præcision kræver 8 bytes. Bemærk dog, at den første byte bruges til at gemme præcisionen, så den faktiske værdi er lagerstørrelsen angivet her plus 1 ekstra byte til at gemme præcisionen.


  1. Vælg alt før eller efter en bestemt karakter i MariaDB

  2. Brugerdefineret dato/klokkeslæt formatering i SQL Server

  3. SSMS 2016-fejl ved import af Azure SQL v12 bacpac:hovednøgler uden adgangskode understøttes ikke

  4. Retter ORA-65096-fejl ved oprettelse af automatiserede test i Django ved hjælp af Oracle