Adatbázis.útmutató

Ez a cikk példákat tartalmaz a dátumérték smalldatetime értékké történő átalakítására az SQL Serverben.

Mikor egy dátumértéket smalldatetime értékké konvertál, az értékhez további információk kerülnek hozzáadásra. Ennek oka, hogy a smalldatetime adattípus dátum- és időinformációt is tartalmaz. A date adattípus ezzel szemben csak dátuminformációkat tartalmaz.

Vannak azonban olyan esetek, amikor a dátum smalldatetime-tá alakítás sikertelen lehet. Különösen, ha a dátumérték kívül esik a smalldatetime által támogatott tartományon, akkor a konverzió hibaüzenettel sikertelen lesz.

Az alábbiakban mindenesetre találunk példákat a két adattípus közötti konverzióra.

1. példa – Implicit konverzió

Itt egy példa a dátum és a smalldatetime közötti implicit konverzióra.

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

Eredmény:

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

Ez egy implicit konverzió, mert nem használunk konverziós függvényt (mint az alábbiakban) az explicit konverzióhoz. Ebben az esetben az SQL Server implicit konverziót hajt végre a színfalak mögött, amikor megpróbáljuk a dátumértéket egy smalldatetime változóhoz rendelni.

Láthatjuk, hogy a date változó csak dátuminformációt tartalmaz, míg a smalldatetime változó dátum- és időinformációt is tartalmaz.

A date és smalldatetime közötti konvertáláskor az időkomponens 00:00:00 értéket kap. Ez percpontos pontosságot biztosít.

Azért van csupa nulla, mert a dátumérték nem tartalmaz semmilyen időinformációt, így az SQL Server nem tudja, hogy milyen időt szeretne (ha van egyáltalán).

Az eredmény természetesen akkor is ezt az eredményt kapja, ha egyszerűen csak dátumértéket rendel egy smalldatetime-hoz, konverzió elvégzése nélkül:

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

Eredmény:

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

Példa 2 – Az idő módosítása

Ha meg kell adnia egy időpontot (de a dátumot megtartva), akkor a DATEADD() függvényt használhatja erre a célra.

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

Eredmény:

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

3. példa – explicit konverzió a CAST()

Ez itt egy példa explicit konverzióra. Ebben az esetben a CAST() függvényt közvetlenül a SELECT utasításon belül használom a dátum és a smalldatetime közötti explicit konverzióhoz.

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

Eredmény:

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

Az implicit konverzióval megegyező eredmény.

Az időt is beállíthatjuk így:

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

Eredmény:

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

4. példa – Explicit konverzió a CONVERT()

használatával

Íme egy példa explicit konverzióra a CONVERT() függvény használatával a CAST() helyett.

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

Eredmény:

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

És az idő beállítása:

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

Eredmény:

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

Példa 5 – Tartományon kívüli hiba

Mint említettük, ha a dátum a smalldatetime adattípus által támogatott tartományon kívül esik, hibát kapunk.

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

Eredmény:

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

A smalldatetime adattípus csak az 1900-01-01 és 2079-06-06 közötti dátumtartományokat támogatja.

A smalldatetime adattípus továbbá csak a 00:00:00-tól 23:59:59-ig terjedő időtartományokat támogatja, ezért szintén hibát kap, ha ezen a tartományon kívüli (például nagyobb pontosságú) értéket próbál használni.

Példa:

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

Eredmény:

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

Mindenesetre ebben az esetben nem a konvertálás során keletkezik hiba, hanem valójában a DATEADD() függvény használata során (mivel a függvény nem engedélyezi az adott dátumrészlet használatát smalldatetime adattípuson).

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.