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

Konvertieren Sie „time“ in „smalldatetime“ in SQL Server (T-SQL-Beispiele)

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

Wenn Sie eine Zeit konvertieren Wert auf smalldatetime , das Datum wird auf „1900-01-01“ gesetzt, und die Stunden- und Minutenwerte werden aufgerundet. Die Sekunden und Sekundenbruchteile werden auf 0 gesetzt.

Beispiel 1 – 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 zum expliziten Konvertieren von time zu smalldatetime .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Ergebnis:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Also wird ein Datumsteil hinzugefügt und auf „1900-01-01“ gesetzt, und in diesem Fall werden die Minutenwerte aufgerundet und die Sekunden auf 0 gesetzt.

Die Microsoft-Dokumentation besagt, dass die Sekundenbruchteile ebenfalls auf Null gesetzt werden, aber die smalldatetime Der Datentyp enthält sowieso keine Sekundenbruchteile.

Übrigens immer dann, wenn Sie die smalldatetime verwenden Datentyp ist die Sekundenkomponente immer auf 0 gesetzt.

Beispiel 2 – Aufrunden der Stunde

Hier ist ein Beispiel für die aufgerundete Stunde:

DECLARE @thetime time(0);
SET @thetime = '10:59:59';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Ergebnis:

+----------+---------------------+
| time     | smalldatetime       |
|----------+---------------------|
| 10:59:59 | 1900-01-01 11:00:00 |
+----------+---------------------+

In diesem Fall habe ich auch für den Zeitwert eine Skala von 0 angegeben, dies hat jedoch keinen Einfluss auf das Ergebnis.

Nur um es klar zu sagen, skaliert ist die Anzahl der Stellen rechts vom Dezimalkomma einer Zahl. Präzision ist die Gesamtzahl der Stellen in der Zahl. Wenn wir eine Skala von 0 angeben, bedeutet dies, dass der Bruchteil nicht enthalten ist.

Beispiel 3 – Explizite Konvertierung mit CONVERT()

Hier ist ein Beispiel mit CONVERT() Funktion anstelle von CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(smalldatetime, @thetime) AS 'smalldatetime';

Ergebnis:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Beispiel 4 – Implizite Konvertierung

Hier ist ein Beispiel dafür, wie Sie dasselbe tun, aber eine implizite Typkonvertierung verwenden.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Ergebnis:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Wir erhalten also dasselbe Ergebnis, unabhängig davon, ob es sich um eine explizite oder implizite Konvertierung handelt.

Dies ist eine implizite Konvertierung, da wir keine Konvertierungsfunktion verwenden, um sie explizit zu konvertieren. Wir weisen einfach den Wert einer Variablen eines Datentyps einer Variablen eines anderen Datentyps zu. In diesem Fall führt SQL Server im Hintergrund eine implizite Konvertierung durch, wenn wir versuchen, die Zeit zuzuweisen Wert auf smalldatetime Variable.

Beispiel 5 – Datum ändern

Wenn Sie das Datum ändern müssen (aber die gleiche Zeit beibehalten), können Sie DATEADD() verwenden Funktion.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Ergebnis:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1985-01-01 23:16:00 |
+------------------+---------------------+

In diesem Fall füge ich 85 zum Jahreswert hinzu, was 1985 ergibt.

Beachten Sie jedoch, dass smalldatetime unterstützt einen sehr engen Datumsbereich (1900-01-01 bis 2079-06-06), sodass das Hinzufügen zu viel zum Jahr zu einem Überlauffehler wie dem folgenden führen kann:

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Ergebnis:

Adding a value to a 'smalldatetime' column caused an overflow.