Sprache

Datums- und Zeitdaten

Mit SQL Server 2008 wurden separate Datentypen für Datum und Uhrzeit sowie erweiterte Datentypen mit größerem Bereich, höherer Genauigkeit und Zeitzonenbewusstsein eingeführt. Verwenden Sie das Microsoft.Data.SqlClient-NuGet-Paket für den Zugriff auf diese Datentypen aus Clientanwendungen. Für die Beispiele in diesem Artikel importieren Sie Microsoft.Data.SqlClient und System.Data in C# oder Visual Basic. Die allgemeinen SQL-Werttypen sind weiterhin in System.Data.SqlTypes enthalten.

SQL Server-Versionen vor SQL Server 2008 hatten nur zwei Datentypen für das Arbeiten mit Datums- und Uhrzeitwerten: datetime und smalldatetime. Beide Datentypen enthalten sowohl einen Datumswert als auch einen Uhrzeitwert, wodurch es schwierig ist, nur mit den Datums- oder nur mit den Uhrzeitwerten zu arbeiten. Außerdem unterstützen diese Datentypen nur Datumsangaben nach Einführung des gregorianischen Kalenders in England im Jahr 1753. Eine weitere Einschränkung besteht darin, dass diese älteren Datentypen keine Zeitzonen berücksichtigen, was es schwierig macht, mit Daten zu arbeiten, die aus mehreren Zeitzonen stammen.

Weitere Informationen zu Datums- und Uhrzeittypen in SQL Server finden Sie unter Datums- und Uhrzeitdatentypen und -funktionen.

Datums-/Uhrzeit-Datentypen in SQL Server 2008 eingeführt

In der folgenden Tabelle werden die Datums- und Uhrzeit-Datentypen beschrieben.

SQL Server-Datentyp BESCHREIBUNG
date Der Bereich der gültigen Werte für den date-Datentyp reicht vom 1. Januar 0001 bis zum 31. Dezember 9999 mit einer Genauigkeit von einem Tag. Der Standardwert ist der 1. Januar 1900. Die Speichergröße beträgt 3 Byte.
time Der time-Datentyp speichert reine Uhrzeitwerte im 24-Stunden-Format. Der time-Datentyp hat einen Bereich von 00:00:00.0000000 bis 23:59:59.9999999 mit einer Genauigkeit von 100 Nanosekunden. Der Standardwert ist 00:00:00.0000000 (Mitternacht). Der time-Datentyp unterstützt benutzerdefinierte Sekundenbruchteilgenauigkeit, und die Speichergröße variiert je nach angegebener Genauigkeit zwischen 3 und 6 Bytes.
datetime2 Der Datentyp datetime2 kombiniert den Bereich und die Genauigkeit der Datentypen date und time zu einem einzelnen Datentyp.

Die Standardwerte und Formate für Zeichenfolgenliterale sind identisch mit denen, die in den Datentypen date und time definiert sind.
datetimeoffset Der datetimeoffset-Datentyp besitzt alle Funktionen von datetime2 und verfügt darüber hinaus über eine zusätzliche Zeitzonenabweichung. Der Zeitzonenoffset wird wie folgt dargestellt: [+|-] HH:MM. Bei HH handelt es sich um zwei Ziffern im Bereich von 00 bis 24, die die Anzahl der Stunden im Zeitzonenoffset darstellen. Bei MM handelt es sich um zwei Ziffern im Bereich von 00 bis 59, die die Anzahl der zusätzlichen Minuten im Zeitzonenoffset darstellen. Uhrzeitformate werden mit einer Genauigkeit von bis zu 100 Nanosekunden unterstützt. Das obligatorische Plus- oder Minuszeichen gibt an, ob der Zeitzonenoffset von der UTC (Universal Time Coordinate oder Greenwich Mean Time) addiert oder subtrahiert wird, um die Ortszeit zu erhalten.

Hinweis

Weitere Informationen über die Verwendung des Type System Version-Schlüsselworts finden Sie unter ConnectionString.

Datumsformat und Datumsreihenfolge

Wie SQL Server Datums- und Uhrzeitwerte analysiert, hängt nicht nur von der Typsystem- und Serverversion ab, sondern auch von der Standardsprache und den Formateinstellungen des Servers. Eine Datumszeichenfolge, die für die Datumsformate einer Sprache funktioniert, wird möglicherweise nicht erkannt, wenn die Abfrage über eine Verbindung erfolgt, die eine andere Sprach- und Datumsformateinstellung verwendet.

Die Transact-SQL-Anweisung SET LANGUAGE legt implizit die DATEFORMAT fest, die die Reihenfolge der Datumsteile bestimmt. Sie können die Transact-SQL-Anweisung SET DATEFORMAT für eine Verbindung verwenden, um Datumswerte eindeutig zu bestimmen, indem Sie Datumsteile in die Reihenfolge MDY, DMY, YMD, YDM, MYD oder DYM sortieren.

Wenn Sie kein DATEFORMAT für die Verbindung angeben, verwendet SQL Server die der Verbindung zugeordnete Standardsprache. Zum Beispiel würde die Datumszeichenfolge 01/02/03 würde auf einem Server mit der Spracheinstellung „Englisch (USA)“ als MDY (Januar 2, 2003) und auf einem Server mit der Spracheinstellung „Englisch (UK)“ als DMY (1. Februar 2003) interpretiert. Das Jahr wird mithilfe der SQL Server-Grenzjahresregel bestimmt, die das Stichtagsdatum für die Zuweisung des Jahrhundertwerts definiert. Weitere Informationen finden Sie unter Option für Jahresangaben mit zwei Ziffern.

Hinweis

Das Datumsformat YDM wird beim Konvertieren von einem Zeichenfolgenformat in date, time, datetimeoffset oder datetime2 nicht unterstützt.

Weitere Informationen zur Interpretation von Datums- und Zeitdaten in SQL Server finden Sie unter Verwenden von Datums- und Zeitdaten.

Datentypen und Parameter zur Angabe von Datum und Uhrzeit

Die folgenden Enumerationen wurden SqlDbType hinzugefügt, um die neuen Datums- und Uhrzeitdatentypen zu unterstützen.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffset

Verwenden Sie einen der vorherigen SqlParameter Enumerationswerte, um den Datentyp für das SqlDbType Objekt anzugeben.

Hinweis

Sie können die DbType-Eigenschaft von SqlParameter nicht auf SqlDbType.Date festlegen.

Um den Parametertyp generisch anzugeben, legen Sie die DbType Eigenschaft auf den DbType Enumerationswert fest. Die folgenden DbType Werte unterstützen die Datentypen datetime2 und datetimeoffset:

  • DbType.DateTime2

  • DbType.DateTimeOffset

Diese neuen Enumerationen ergänzen die Enumerationen Date, Time und DateTime, die bereits in früheren .NET Framework-Versionen vorhanden waren.

Der .NET Framework-Datenanbietertyp eines Parameterobjekts wird vom .NET Framework-Typ des Werts des Parameterobjekts oder vom DbType des Parameterobjekts hergeleitet. Es wurden keine neuen System.Data.SqlTypes-Datentypen eingeführt, um die neuen Datums- und Uhrzeitdatentypen zu unterstützen. In der folgenden Tabelle werden die Zuordnungen zwischen den Datums- und Uhrzeitdatentypen von SQL Server 2008 und den CLR-Datentypen beschrieben.

SQL Server-Datentyp .NET Framework-Typ System.Data.SqlDbType System.Data.DbType
date System.DateTime Date Date
time System.TimeSpan Time Time
datetime2 System.DateTime DateTime2 DateTime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
datetime System.DateTime DateTime DateTime
smalldatetime System.DateTime DateTime DateTime

SqlParameter-Eigenschaften

In der folgenden Tabelle werden SqlParameter-Eigenschaften beschrieben, die für Datums- und Uhrzeitdatentypen relevant sind.

Eigenschaft BESCHREIBUNG
IsNullable Ruft ab oder legt fest, ob ein Wert NULL sein kann. Wenn Sie den Parameterwert NULL an den Server senden, müssen Sie DBNull anstelle von null (Nothing in Visual Basic) angeben. Weitere Informationen zu NULL-Werten bei Datenbanken finden Sie unter Handling Null Values.
Precision Ruft die maximale Anzahl von Stellen ab, die verwendet werden, um den Wert darzustellen, oder legt diese fest. Diese Einstellung wird für Datums -und Uhrzeitdatentypen ignoriert.
Scale Dient zum Abrufen oder Festlegen der Bruch-Sekunden-Genauigkeit für Time, DateTime2, und DateTimeOffset. Wenn Sie die Skala nicht explizit festlegen, sendet der Treiber Skala 7. Explizites Festlegen der Skalierung auf 0 fordert null Nachkommastellen der Sekunden an.
Size Wird für Datums -und Uhrzeitdatentypen ignoriert.
Value Ruft den Parameterwert ab oder legt ihn fest.
SqlValue Ruft den Parameterwert ab oder legt ihn fest.

Hinweis

Uhrzeitwerte, die kleiner als 0 oder größer oder gleich 24 Stunden sind, lösen eine ArgumentException aus.

Erstellen von Parametern

Erstellen Sie SqlParameter-Objekte mit dem Konstruktor oder rufen Sie die Add-Methode in der Parameters-Sammlung des Befehls auf. Die Add-Methode verwendet entweder Konstruktorargumente oder ein vorhandenes Parameterobjekt.

Die nächsten Abschnitte in diesem Thema enthalten Beispiele zum Angeben von Datums- und Uhrzeitparametern. Weitere Beispiele für die Arbeit mit Parametern finden Sie unter Konfigurieren von Parametern und Parameterdatentypen und Parameter von DataAdapter.

Datumsbeispiel

Das folgende Codefragment zeigt, wie ein date-Parameter angegeben wird.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Date";
parameter.SqlDbType = SqlDbType.Date;
parameter.Value = "2007/12/1";
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Date"
parameter.SqlDbType = SqlDbType.Date
parameter.Value = "2007/12/1"

Uhrzeitbeispiel

Das folgende Codefragment zeigt, wie ein time-Parameter angegeben wird.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@time";
parameter.SqlDbType = SqlDbType.Time;
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Time"
parameter.SqlDbType = SqlDbType.Time
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay

Datetime2-Beispiel

Das folgende Codefragment zeigt, wie ein datetime2-Parameter mit Datums- und Uhrzeitteilen angegeben wird.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Datetime2";
parameter.SqlDbType = SqlDbType.DateTime2;
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Datetime2"
parameter.SqlDbType = SqlDbType.DateTime2
parameter.Value = DateTime.Parse("1666-09-02 1:00:00")

DateTimeOffSet-Beispiel

Das folgende Codefragment zeigt, wie ein DateTimeOffset-Parameter mit einem Datum, einer Uhrzeit und dem Zeitzonenoffset 0 angegeben werden kann.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@DateTimeOffSet";
parameter.SqlDbType = SqlDbType.DateTimeOffset;
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@DateTimeOffSet"
parameter.SqlDbType = SqlDbType.DateTimeOffset
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00")

AddWithValue

Um Parameter anzugeben, könne Sie auch AddWithValue in der Parameters-Sammlung des Befehls angeben, wie im folgenden Codefragment gezeigt. AddWithValue lässt Sie jedoch nicht DbType oder SqlDbType für den Parameter angeben.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"));
command.Parameters.AddWithValue( _
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"))

Für diesen DateTimeOffset-Wert interferiert AddWithValue mit SqlDbType.DateTimeOffset. Wenn Sie auf einen anderen SQL Server-Datums- oder -Uhrzeittyp abzielen möchten, legen Sie die SqlDbType-Eigenschaft des Parameters explizit fest.

Die folgende Tabelle zeigt, welche SqlDbTypes von welchen CLR-Typen abgeleitet werden:

CLR-Datentyp Abgeleitet SqlDbType
DateTime SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

Abrufen von Datums- und Uhrzeitdaten

In der folgenden Tabelle werden die Methoden zum Abrufen von Datums- und Uhrzeitwerten in SQL Server 2008 beschrieben.

SqlClient-Methode BESCHREIBUNG
GetDateTime Ruft den angegebenen Spaltenwert als DateTime.
GetDateTimeOffset Ruft den angegebenen Spaltenwert als DateTimeOffset.
GetProviderSpecificFieldType Gibt den Typ zurück, der der zugrunde liegende anbieterspezifische Typ des Felds ist. Gibt für neue Datums- und Uhrzeittypen die gleichen Typen wie GetFieldType zurück.
GetProviderSpecificValue Ruft den Wert der angegebenen Spalte ab. Gibt für die neuen Datums- und Uhrzeittypen die gleichen Typen wie GetValue zurück.
GetProviderSpecificValues Ruft die Werte im angegebenen Array ab.
GetSqlString Ruft den Spaltenwert als SqlString ab. Die Methode löst InvalidCastException aus, wenn die Daten nicht als SqlString ausgedrückt werden können.
GetSqlValue Ruft Spaltendaten als ihren standardmäßigen SqlDbType ab. Gibt für die neuen Datums- und Uhrzeittypen die gleichen Typen wie GetValue zurück.
GetSqlValues Ruft die Werte im angegebenen Array ab.
GetString Ruft den Spaltenwert als Zeichenfolge ab, wenn „Type System Version“ auf SQL Server 2005 festgelegt ist. Die Methode löst InvalidCastException aus, wenn die Daten nicht als Zeichenfolge ausgedrückt werden können.
GetTimeSpan Ruft den angegebenen Spaltenwert als TimeSpan.
GetValue Ruft den angegebenen Spaltenwert als zugrunde liegenden CLR-Typ ab.
GetValues Ruft Spaltenwerte in einem Array ab.
GetSchemaTable Gibt die Metadaten des Resultsets im DataTable Objekt zurück.

Hinweis

Die neue Datums- und Uhrzeitwerte für SqlDbTypes werden nicht für Code unterstützt, der in SQL Server prozessintern ausgeführt wird. Eine Ausnahme wird ausgelöst, wenn einer dieser Typen an den Server übergeben wird.

Angeben von Datums- und Uhrzeitwerten als Literale

Sie können Datums- und Uhrzeitdatentypen mithilfe einer Vielzahl verschiedener Literalzeichenfolgenformate angeben, die SQL Server dann zur Laufzeit auswertet und sie in interne Datums-/Uhrzeitstrukturen konvertiert. SQL Server erkennt Datums- und Uhrzeitdaten, die in einfache Anführungszeichen (') eingeschlossen sind. Die folgenden Beispiele veranschaulichen einige Formate:

  • Alphabetische Datumsformate wie 'October 15, 2006'.

  • Numerische Datumsformate wie '10/15/2006'.

  • Ungetrennte Zeichenfolgenformate wie '20061015', die als 15. Oktober 2006 interpretiert werden, wenn Sie das ISO-Standarddatumsformat verwenden.

Uhrzeitwerte, die kleiner als 0 oder größer oder gleich 24 Stunden sind, lösen eine ArgumentException aus.

SQL Server-Dokumentationsressourcen

Weitere Informationen zur Arbeit mit Datums- und Zeitwerten in SQL Server finden Sie in folgenden Artikeln.

Artikel BESCHREIBUNG
Datums- und Uhrzeitdatentypen und zugehörige Funktionen (Transact-SQL) Bietet eine Übersicht über alle Transact-SQL-Datentypen und -Funktionen zur Angabe des Datums und der Uhrzeit.
Verwenden von Datums- und Uhrzeitdaten Stellt Informationen zu den Datentypen und Funktionen zur Angabe des Datums und der Uhrzeit sowie Beispiele für deren Verwendung bereit.
Datentypen (Transact-SQL) Beschreibt die Systemdatentypen in SQL Server 2008.

Siehe auch