Database
 sql >> Datenbank >  >> RDS >> Database

T-SQL Datetime-Datentyp

Einführung

Datentypen sind Attribute, die die Art von Daten angeben, die Objekte wie Spalten, lokale Variablen, Ausdrücke und Parameter enthalten können. In der RDBMS-Welt werden Datentypen normalerweise in Zeichenfolgen-, numerische und Datumsdatentypen gruppiert.

T-SQL unterstützt 6 Datums- und Zeitdatentypen, nämlich:

  1. DatumUhrzeit
  2. Smalldatetime
  3. Datum
  4. Zeit
  5. DatumUhrzeit2
  6. Datum/Uhrzeit-Offset

Die ersten beiden Datentypen gelten als Legacy-Versionen der neueren. In diesem Artikel konzentrieren wir uns auf die Datumsdatentypen und insbesondere auf datetime und datetime2 Datentypen, die in SQL Server verfügbar sind. Tabelle 1 enthält Einzelheiten zu den verschiedenen Datums- und Zeitdatentypen, die in SQL Server verfügbar sind.

[Tabellen-ID=59 /]

Tab 1 Datums- und Zeitdatentypen

DatumUhrzeit und DatumUhrzeit2

Datatime ist ein Datentyp, der Datum und Uhrzeit im 24-Stunden-Format kombiniert. Der im datetime-Datentyp unterstützte Datumsbereich ist wie in Tab 1 dargestellt und hat eine Genauigkeit von etwa 3 Millisekunden.

Datetime2 ist eine Erweiterung des datetime-Datentyps. Es bietet Platz für einen größeren Bereich möglicher Werte und hat eine Genauigkeit von 100 Nanosekunden, was viel besser ist als sein Vorgänger. Ein weiterer wichtiger Aspekt des dattime2-Datentyps ist, dass der erforderliche Speicherplatz je nach gewählter Genauigkeit zwischen 6 und 8 Bytes liegt.

  • Sie können eine Genauigkeit von 1 Millisekunde erreichen, indem Sie drei Dezimalstellen für die Sekundenkomponente zulassen. Jeder Wert verbraucht also sechs Bytes.
  • Sie können eine Genauigkeit von 100 Nanosekunden erreichen, indem Sie sieben Dezimalstellen für die Sekundenkomponente zulassen. Jeder Wert verbraucht somit acht Bytes.

Demonstrationen

Falsche Datumswerte einfügen

Wir erstellen eine Tabelle mit den in Listing 1 gezeigten Details, um einige Demonstrationen durchzuführen, die veranschaulichen, wie man die datetime manipuliert und datetime2 Datentypen.

-- Listing 1 Create Table and insert Rows
-- Create Table with Data Types
use Practice2017
go
create table staffers (
fname varchar(50),
lname varchar(50),
JobTitle varchar(100),
DOB datetime,
PreciseDOB datetime2,
LastLoginTime time)
go

Dann versuchen wir, die Tabelle mit einer Zeile zu füllen, wie in Listing 2 gezeigt, aber wir erhalten den Fehler, der in Abb. 1 gezeigt wird. Das Schlüsselwort in der Fehlermeldung ist „out-of-range“-Werte. Was es bedeutet ist, dass ihr Wert, den wir einzufügen versuchen, entweder niedriger als 01-Jan-1753 ist oder höher als 31. Dez. 9999 . In diesem Fall besteht das Problem darin, dass wir nicht das empfohlene Eingabeformat von „JJJJMMTT hh:mm:ss.nnn verwendet haben “ (siehe Tabelle 1). Auslesen des Wertes „06101979 ‘, SQL Server nimmt an, dass 0610 das Jahr ist (entspricht YYYY). Dieser Fehler wird für den Datentyp datetime2 nicht ausgegeben, da der Bereich für datetime2 ab dem Jahr 0001 größer ist.

-- Listing 2 Insert Rows with Wrong Entry Format
insert into staffers 
values
(
'Kenneth'
,'Igiri'
,'Database Administrator'
,'06101979'
,'06101979'
,'8:00 AM'
)

Abb. 1 Fehler, der für Datetime-Spalte zurückgegeben wird

Korrekte Datumswerte einfügen

Wir versuchen, das Problem zu beheben, indem wir das richtige Eingabeformat für die datetime-Spalte eingeben, wie in Listing 3 gezeigt. Wenn wir die Anweisung erneut ausführen, erhalten wir den in Abb. 2 gezeigten Fehler. Dieser Fehler wird im Wesentlichen durch denselben Fehler verursacht die Angaben zum Eingabeformat. Das Problem liegt jedoch im anderen Teil des Datums „06101979 “, was dem Eingabeformat „YYYYMMDD hh:mm:ss.nnn entspricht ’. In diesem Fall hat SQL Server 19 angenommen Ist ein Monat und 79 ist ein Tag im Monat. Der Versuch dieser impliziten Konvertierung schlägt fehl, da keine der vorhergehenden Behauptungen wahr ist.

-- Listing 3 Insert Rows with One Correct Entry Format
insert into staffers 
values
(
'Kenneth'
,'Igiri'
,'Database Administrator'
,'19791006'
,'01061979'
,'8:00 AM'
)

Abb. 2 Fehler, der für Datetime2-Spalte zurückgegeben wird

Listing 4 erlaubt uns, die letzte Behauptung zu demonstrieren. Der Wert 01101201 passt in den Bereich für datetime2 und wir können die Zeile einfügen. Dieser Wert entspricht dem 1. Dezember 0110, wie wir in Abb. 3 sehen.

-- Listing 4: Insert Rows with Correct Date Format
insert into staffers 
values
(
'Kenneth'
,'Igiri'
,'Database Administrator'
,'19791006'
,'01101201'
,'8:00 AM')
-- Listing 5: Insert Rows with All Correct Entry Format
insert into staffers 
values
(
'Kenneth'
,'Igiri'
,'Database Administrator'
,'19791006'
,'19791006'
,'8:00 AM'
)

Verifizierung der Daten

Abb. 3 Abfrage des Datensatzes

Wenn wir die staffers-Tabelle abfragen, sehen wir deutlich die Genauigkeit des datetime-Datentyps im Vergleich zur datetime2-Alternative. Kommen wir zu etwas etwas Unheimlicherem:Spracheinstellungen. Schauen Sie sich Listing 6 an. Wir fügen genau die gleichen Datensätze im Datumsformat 06/10/1979 ein . Dieses Format ist NICHT sprachneutral, wenn wir also die Sprache auf Britisch setzen in der ersten Anweisung und dann zu us_english im zweiten stellen wir fest, dass wir tatsächlich zwei verschiedene Daten eingefügt haben, obwohl unsere Rohwerte gleich sind. Deshalb ist es so wichtig, beim Umgang mit datetime immer das empfohlene Eingabeformat zu verwenden und datetime2 .

-- Listing 6: Impact of Language Settings

set language british
insert into staffers 
values
(
'Kenneth'
,'Igiri'
,'Database Administrator'
,'06/10/1979'
,'06/10/1979'
,'8:00 AM'
)


set language us_english
insert into staffers 
values
(
'Kenneth'
,'Igiri'
,'Database Administrator'
,'06/10/1979'
,'06/10/1979'
,'8:00 AM'
)

Abb. 4 Mitarbeiter befragen

Mit der Spracheinstellung Britisch , interpretiert SQL Server die ersten beiden Ziffern als Tag, jedoch mit der Spracheinstellung als us_english , interpretiert SQL Server die ersten beiden Ziffern als Monat. Eine letzte Sache, die wir hier erwähnen müssen, ist, dass wir beim Einfügen unserer Datensätze die Zeitkomponente nicht angegeben haben, sodass SQL Server automatisch davon ausgeht, dass es sich um mittlere Mitternacht des angegebenen Datums handelt.

Schlussfolgerung

In diesem Artikel haben wir gelernt, wie die Datentypen datetime und datetime2 aussehen, welche Hauptunterschiede sie haben und wie Sie sicherstellen können, dass Sie bei der Verwendung dieser Datentypen das richtige Datum eingeben. Dabei haben wir auch zwei Fehler untersucht, auf die ein Entwickler beim Arbeiten mit diesen Datentypen stoßen könnte.

Referenzen

  • SQL-Datentypen
  • Ben-Gan, I. (2016) T-SQL-Grundlagen. S. 74-78. Microsoft Press.