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

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

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

Når du konverterer en smalldatetime værdi til datetime , timer og minutter kopieres, og sekunder og brøksekunder indstilles til 0 .

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 til eksplicit at konvertere fra smalldatetime til datotid .

DECLARE @thesmalldatetime smalldatetime
SET @thesmalldatetime = '2031-03-25 11:15:29'
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CAST(@thesmalldatetime AS datetime) AS 'datetime';

Resultat:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 |
+---------------------+-------------------------+

For det første kan vi se, at den lille datotid værdi bruger 00 for sekunder-komponenten, selvom vi udtrykkeligt har sat den til 29 . Dette skyldes, at når du bruger thesmalldatetime datatype, er sekunderne altid nul (og uden brøksekunder).

Derfor, når vi konverterer værdien til datetime , sættes sekundværdien (og brøksekunder) til nul. Havde vi lige tildelt den oprindelige værdi til datetime i første omgang ville sekunderne være forblevet intakte:

DECLARE @thedatetime datetime
SET @thedatetime = '2031-03-25 11:15:29'
SELECT @thedatetime AS 'thedatetime';

Resultat:

+-------------------------+
| thedatetime             |
|-------------------------|
| 2031-03-25 11:15:29.000 |
+-------------------------+

Ikke alene ville sekunderne forblive intakte, men også alle brøkdele sekunder ville være forblevet intakte (men kun op til en skala fra 3):

DECLARE @thedatetime datetime
SET @thedatetime = '2031-03-25 11:15:29.123'
SELECT @thedatetime AS 'thedatetime';

Resultat:

+-------------------------+
| thedatetime             |
|-------------------------|
| 2031-03-25 11:15:29.123 |
+-------------------------+

Eksempel 2 – Afrunding

Her er, hvad der sker, hvis vi indstiller sekunder-komponenten til en højere værdi, før vi tildeler den til smalldatetime datatype.

DECLARE @thesmalldatetime smalldatetime
SET @thesmalldatetime = '2031-03-25 11:15:31'
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CAST(@thesmalldatetime AS datetime) AS 'datetime';

Resultat:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2031-03-25 11:16:00 | 2031-03-25 11:16:00.000 |
+---------------------+-------------------------+

Så minutkomponenten er nu rundet op til næste minut.

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 @thesmalldatetime smalldatetime
SET @thesmalldatetime = '2031-03-25 11:15:29'
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CONVERT(datetime, @thesmalldatetime) AS 'datetime';

Resultat:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 |
+---------------------+-------------------------+

Eksempel 4 – Implicit konvertering

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

DECLARE @thesmalldatetime smalldatetime, @thedatetime datetime
SET @thesmalldatetime = '2031-03-25 11:15:29'
SET @thedatetime = @thesmalldatetime
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  @thedatetime AS 'datetime';

Resultat:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 |
+---------------------+-------------------------+

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 smalldatetime værdi til en datotid variabel.


  1. java.lang.NoSuchFieldError:NONE i dvale med Spring 3, maven, JPA, c3p0

  2. GROUP BY og aggregerede sekventielle numeriske værdier

  3. CURRENT_TIMESTAMP() Funktion i Oracle

  4. Tidsstempel med en millisekunds præcision:Sådan gemmer du dem i MySQL