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

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

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

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

Der er dog tilfælde, hvor en dato til smalldatetime konvertering kan mislykkes. Især hvis datoen værdien er uden for det interval, der understøttes af smalldatetime så mislykkes det med en fejl.

Under alle omstændigheder er nedenfor eksempler på konvertering mellem disse to datatyper.

Eksempel 1 – Implicit konvertering

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

DECLARE @thedate date, @thesmalldatetime smalldatetime
SET @thedate = '2020-12-01'
SET @thesmalldatetime = @thedate
SELECT 
  @thedate AS 'date',
  @thesmalldatetime AS 'smalldatetime';

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 00:00:00 |
+------------+---------------------+

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

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

Når du konverterer mellem dato og smalldatetime , er tidskomponenten indstillet til 00:00:00 . Dette giver en nøjagtighed til minuttet.

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

Selvfølgelig får du også dette resultat, selvom du blot tildeler en værdi, der kun er dato, til en smalldatetime uden at udføre en konvertering:

DECLARE @thesmalldatetime smalldatetime = '2020-12-01'
SELECT @thesmalldatetime AS 'smalldatetime';

Resultat:

+---------------------+
| smalldatetime       |
|---------------------|
| 2020-12-01 00:00:00 |
+---------------------+

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, @thesmalldatetime smalldatetime
SET @thedate = '2020-12-01'
SET @thesmalldatetime = @thedate
SET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)
SELECT 
  @thedate AS 'date',
  @thesmalldatetime AS 'smalldatetime';

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 07:00:00 |
+------------+---------------------+

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

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

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 00:00:00 |
+------------+---------------------+

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, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 07:00:00 |
+------------+---------------------+

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(smalldatetime, @thedate) AS 'smalldatetime';

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 00:00:00 |
+------------+---------------------+

Og justering af tiden:

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

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 07:00:00 |
+------------+---------------------+

Eksempel 5 – Uden for rækkevidde-fejl

Som nævnt, hvis datoen er uden for det interval, der understøttes af smalldatetime datatype, får du en fejl.

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

Resultat:

The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.

Den smalldatetime datatypen understøtter kun datointervaller 1900-01-01 til 2079-06-06.

Også smalldatetime datatypen understøtter kun tidsintervaller 00:00:00 til 23:59:59, så du får også en fejl, hvis du forsøger at bruge en værdi uden for dette område (f.eks. med en højere præcision).

Eksempel:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Resultat:

The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.

Men i dette tilfælde er det ikke en fejl under konvertering, det er faktisk en fejl under brug af DATEADD() funktion (fordi funktionen ikke tillader, at den pågældende datodel bruges på en smalldatetime datatype).


  1. 4 datatyper, der skal udfases i SQL Server

  2. Sådan bruges egenskaben IDENTITY() i SQL Server

  3. Guide til design af database til sociale netværkssystem i MySQL

  4. MySQL LOAD DATA INFIL med PÅ DUBLIKAT NØGLEOPDATERING