Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Beispiele für die Konvertierung von „date“ in „smalldatetime“ in SQL Server (T-SQL)

Dieser Artikel enthält Beispiele für die Konvertierung eines Datums Wert auf smalldatetime Wert in SQL Server.

Wenn Sie ein Datum konvertieren Wert auf smalldatetime , werden dem Wert zusätzliche Informationen hinzugefügt. Das liegt daran, dass smalldatetime Datentyp enthält sowohl Datums- als auch Zeitinformationen. Das Datum Datentyp hingegen enthält nur Datumsinformationen.

Es gibt jedoch Fälle, in denen ein Datum zu smalldatetime Konvertierung kann fehlschlagen. Insbesondere, wenn das Datum Der Wert liegt außerhalb des von smalldatetime unterstützten Bereichs dann schlägt es mit einem Fehler fehl.

In jedem Fall finden Sie unten Beispiele für die Konvertierung zwischen diesen beiden Datentypen.

Beispiel 1 – Implizite Konvertierung

Hier ist ein Beispiel für eine implizite Konvertierung zwischen date und smalldatetime .

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

Ergebnis:

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

Dies ist eine implizite Konvertierung, da wir keine Konvertierungsfunktion (wie die unten) verwenden, um sie explizit zu konvertieren. In diesem Fall führt SQL Server im Hintergrund eine implizite Konvertierung durch, wenn wir versuchen, das Datum zuzuweisen Wert auf smalldatetime Variable.

Wir können das Datum sehen Variable enthält nur Datumsinformationen, wohingegen die smalldatetime Variable enthält sowohl Datums- als auch Zeitinformationen.

Beim Umrechnen zwischen Datum und smalldatetime , wird die Zeitkomponente auf 00:00:00 gesetzt . Dies sorgt für eine minutengenaue Genauigkeit.

Der Grund, warum es nur Nullen sind, liegt darin, dass der Datumswert keine Zeitinformationen enthält, sodass SQL Server nicht wissen kann, wann Sie möchten (falls vorhanden).

Natürlich erhalten Sie dieses Ergebnis auch dann, wenn Sie smalldatetime einfach einen Nur-Datum-Wert zuweisen ohne eine Konvertierung durchzuführen:

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

Ergebnis:

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

Beispiel 2 – Uhrzeit ändern

Wenn Sie eine Zeit angeben müssen (aber dasselbe Datum beibehalten), können Sie DATEADD() verwenden Funktion, um genau das zu tun.

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

Ergebnis:

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

Beispiel 3 – Explizite Konvertierung mit CAST()

Hier ist ein Beispiel für eine explizite Konvertierung. In diesem Fall verwende ich den CAST() Funktion direkt innerhalb des SELECT Anweisung, explizit zwischen date zu konvertieren und smalldatetime .

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

Ergebnis:

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

Gleiches Ergebnis wie die implizite Konvertierung.

Wir können die Zeit auch so anpassen:

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

Ergebnis:

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

Beispiel 4 – Explizite Konvertierung mit CONVERT()

Hier ist ein Beispiel für eine explizite Konvertierung mit CONVERT() Funktion anstelle von CAST() .

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

Ergebnis:

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

Und die Uhrzeit anpassen:

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

Ergebnis:

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

Beispiel 5 – Bereichsüberschreitung

Wie bereits erwähnt, wenn das Datum außerhalb des von smalldatetime unterstützten Bereichs liegt Datentyp erhalten Sie eine Fehlermeldung.

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

Ergebnis:

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

Die smalldatetime Datentyp unterstützt nur die Datumsbereiche 1900-01-01 bis 2079-06-06.

Auch die smalldatetime Der Datentyp unterstützt nur Zeitbereiche von 00:00:00 bis 23:59:59, sodass Sie auch einen Fehler erhalten, wenn Sie versuchen, einen Wert außerhalb dieses Bereichs zu verwenden (z. B. mit einer höheren Genauigkeit).

Beispiel:

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

Ergebnis:

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

In diesem Fall handelt es sich jedoch nicht um einen Fehler beim Konvertieren, sondern tatsächlich um einen Fehler bei der Verwendung von DATEADD() -Funktion (weil die Funktion es nicht zulässt, dass dieser bestimmte Datumsteil für eine kleine Datumszeit verwendet wird Datentyp).