sql >> Database >  >> RDS >> Sqlserver

Converteer 'smalldatetime' naar 'datetime2' in SQL Server (T-SQL-voorbeelden)

Dit artikel bevat voorbeelden van het converteren van een smalldatetime waarde toe aan een datetime2 waarde in SQL Server.

De smalldatetime gegevenstype heeft geen fractionele seconden en de secondencomponent is altijd ingesteld op nul (:00). De nauwkeurigheid is tot op de minuut nauwkeurig.

De datetime2 gegevenstype daarentegen stelt u in staat om een ​​precisie van een fractie van een seconde van 0 tot 7 op te geven. Als u dit niet opgeeft, wordt 7 gebruikt (de standaard). Als u nul opgeeft (0 ), is de nauwkeurigheid tot op de seconde nauwkeurig.

Wanneer u een smalldatetime . converteert waarde tot datetime2 , worden de uren en minuten gekopieerd. De seconden en fractionele seconden zijn ingesteld op 0.

Voorbeeld 1 – Impliciete conversie

Hier is een voorbeeld van een impliciete conversie tussen smalldatetime en datetime2 .

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetime2 AS 'datetime2';

Resultaat:

+---------------------+-----------------------------+
| smalldatetime       | datetime2                   |
|---------------------+-----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 |
+---------------------+-----------------------------+

Dit is een impliciete conversie omdat we geen conversiefunctie (zoals hieronder) gebruiken om deze expliciet te converteren. In dit geval voert SQL Server achter de schermen een impliciete conversie uit wanneer we proberen de smalldatetime toe te wijzen waarde toe aan een datetime2 variabel.

In dit voorbeeld kunnen we zien dat de smalldatetime waarde omvat niet de fractionele seconden, de seconden zijn ingesteld op nul en de minuut is naar boven afgerond.

In dit geval is de datetime2 waarde gebruikt een nauwkeurigheid van 7. Dit komt omdat 7 de standaardwaarde is. Ik heb geen precisie opgegeven en daarom is de standaardwaarde gebruikt. Dit resulteert in 7 nullen die worden gebruikt in het fractionele deel.

Voorbeeld 2 – Verwijder het fractionele deel

U kunt de fractionele seconden indien nodig verwijderen. Gebruik hiervoor gewoon datetime2(0) bij het declareren van de variabele.

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetime2 AS 'datetime2';

Resultaat:

+---------------------+---------------------+
| smalldatetime       | datetime2           |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

Dus in dit geval retourneren beide gegevenstypen dezelfde waarde. Het verschil is echter dat de datetime2 heeft de mogelijkheid om tot op de seconde nauwkeurig te zijn (vergeleken met smalldatetime nauwkeurigheid tot op de minuut).

Voorbeeld:

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  DATEADD(second, 30, @thesmalldatetime) AS 'smalldatetime',
  DATEADD(second, 30, @thedatetime2) AS 'datetime2';

Resultaat:

+---------------------+---------------------+
| smalldatetime       | datetime2           |
|---------------------+---------------------|
| 2025-05-21 10:17:00 | 2025-05-21 10:16:30 |
+---------------------+---------------------+

In dit voorbeeld gebruikte ik de DATEADD() functie om 30 seconden toe te voegen aan elke waarde. Elk gegevenstype retourneert echter een ander resultaat. De datetime2 datatype eert het secondegedeelte en geeft het juiste resultaat met 100% nauwkeurigheid. De smalldatetime type daarentegen wordt naar boven afgerond op de dichtstbijzijnde minuut (terwijl het secondegedeelte op nul blijft).

Voorbeeld 3 – Expliciete conversie met CAST()

Hier is een voorbeeld van een expliciete conversie. In dit geval gebruik ik de CAST() functie direct binnen de SELECT statement om expliciet te converteren tussen smalldatetime en datetime2 .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CAST(@thesmalldatetime AS datetime2(0)) AS 'datetime2(0)';

Resultaat:

+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

Voorbeeld 4 – Expliciete conversie met CONVERT()

Hier is een voorbeeld van een expliciete conversie met de CONVERT() functie in plaats van CAST() .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CONVERT(datetime2(0), @thesmalldatetime) AS 'datetime2(0)';

Resultaat:

+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

  1. ORA-01034:ORACLE niet beschikbaar ORA-27101:gedeelde geheugenrealm bestaat niet

  2. Verschil tussen subquery en gecorreleerde subquery

  3. Hoe u SQL Server-gebeurtenissen vastlegt en analyseert

  4. Converteer alle records in postgre naar Titlecase, eerste letter hoofdletters