sql >> Database >  >> RDS >> Sqlserver

Voorbeelden van het converteren van 'date' naar 'smalldatetime' in SQL Server (T-SQL)

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

Wanneer u een datum converteert waarde voor smalldatetime , wordt er extra informatie aan de waarde toegevoegd. Dit komt omdat de smalldatetime gegevenstype bevat zowel datum- als tijdinformatie. De datum gegevenstype daarentegen bevat alleen datuminformatie.

Er zijn echter gevallen waarin een datum naar smalldatetime conversie kan mislukken. In het bijzonder, als de datum waarde ligt buiten het bereik dat wordt ondersteund door smalldatetime dan zal het mislukken met een fout.

Hieronder staan ​​in ieder geval voorbeelden van conversie tussen deze twee datatypes.

Voorbeeld 1 – Impliciete conversie

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

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

Resultaat:

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

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 datum toe te wijzen waarde toe aan een smalldatetime variabel.

We kunnen zien dat de datum variabele bevat alleen datuminformatie, terwijl de smalldatetime variabele bevat zowel datum- als tijdinformatie.

Wanneer u converteert tussen datum en smalldatetime , de tijdcomponent is ingesteld op 00:00:00 . Dit zorgt voor een nauwkeurigheid tot op de minuut.

De reden dat het allemaal nullen zijn, is omdat de datumwaarde geen tijdinformatie bevat, dus SQL Server kan op geen enkele manier weten hoe laat u wilt (indien aanwezig).

Natuurlijk krijgt u dit resultaat ook als u eenvoudig een datumwaarde toewijst aan een smalldatetime zonder een conversie uit te voeren:

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

Resultaat:

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

Voorbeeld 2 – Wijzig de tijd

Als u een tijd moet opgeven (maar dezelfde datum wilt behouden), kunt u de DATEADD() gebruiken functie om precies dat te doen.

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';

Resultaat:

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

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

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

Resultaat:

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

Hetzelfde resultaat als de impliciete conversie.

We kunnen de tijd ook als volgt aanpassen:

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

Resultaat:

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

Voorbeeld 4 – Expliciete conversie met CONVERT()

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

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

Resultaat:

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

En de tijd aanpassen:

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

Resultaat:

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

Voorbeeld 5 – Fout buiten bereik

Zoals vermeld, als de datum buiten het bereik valt dat wordt ondersteund door de smalldatetime gegevenstype, krijgt u een foutmelding.

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

Resultaat:

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

De smalldatetime gegevenstype ondersteunt alleen datumbereiken 1900-01-01 tot 2079-06-06.

Ook de smalldatetime gegevenstype ondersteunt alleen tijdbereiken van 00:00:00 tot 23:59:59, dus u krijgt ook een foutmelding als u een waarde buiten dat bereik probeert te gebruiken (bijvoorbeeld met een hogere precisie).

Voorbeeld:

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

Resultaat:

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

In dit geval is het echter geen fout tijdens het converteren, het is eigenlijk een fout tijdens het gebruik van de DATEADD() functie (omdat de functie niet toestaat dat bepaalde datepart wordt gebruikt op een smalldatetime gegevenstype).


  1. Verbetering van een functie die UPSERT op basis van een invoerarray

  2. Wat is de standaardprecisie en schaal voor een getal in Oracle?

  3. Hoe RLIKE werkt in MariaDB

  4. Hoe toon ik lopende processen in Oracle DB?