Datums- und Zeitdaten

SQL Server 2008 bietet neue Datentypen für Datums- und Uhrzeitinformationen. Die neuen Datentypen umfassen getrennte Typen für Datum und Uhrzeit sowie erweiterte Datentypen mit größerem Umfang, mehr Präzision und besserer Berücksichtigung von Zeitzonen. Ab .NET Framework Version 3.5 Service Pack (SP) 1 bietet der .NET Framework-Datenanbieter für SQL Server (System.Data.SqlClient) vollständige Unterstützung für alle neuen Funktionen der SQL Server 2008-Datenbank-Engine. Sie müssen .NET Framework 3.5 SP1 (oder höher) installieren, um diese neuen Funktionen mit SqlClient zu verwenden.

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.

Neue Datums-/Uhrzeitdaten in SQL Server 2008

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, verfügt darüber hinaus aber auch über eine als Abweichung (Offset) von der koordinierten Weltzeit angegebene Zeitzonenangabe. 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 das DATEFORMAT fest, das 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 die Datumsteile in der Reihenfolge MTJ, TMJ, JMT, JTM, MJT oder TJM sortieren.

Wenn Sie kein DATEFORMAT für die Verbindung angeben, verwendet SQL Server die der Verbindung zugeordnete Standardsprache. Beispiel: Die Datumszeichenfolge 01/02/03 würde auf einem Server mit der Spracheinstellung „Englisch (USA)“ als MTJ (Januar 2, 2003) und auf einem Server mit der Spracheinstellung „Englisch (UK)“ als TMJ (1. Februar 2003) interpretiert. Das Jahr wird mithilfe der SQL Server-Regel für das Umstellungsjahr bestimmt, die das Umstellungsdatum für die Zuweisung des Jahrhundertwerts definiert. Weitere Informationen finden Sie unter Option "Cutoff für zweistellige Ziffern".

Hinweis

Das Datumsformat JTM wird bei der Konvertierung aus einem Zeichenfolgenformat in date, time, datetime2 oder datetimeoffset nicht unterstützt.

Weitere Informationen dazu, wie SQL Server Datums- und Uhrzeitdaten interpretiert, finden Sie unter Verwenden von Datums- und Uhrzeitdaten.

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

Sie können den Datentyp eines SqlParameter mithilfe einer der voranstehenden SqlDbType-Enumerationen angeben.

Hinweis

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

Der Typ eines SqlParameter kann auch generisch angegeben werden, indem die DbType-Eigenschaft eines SqlParameter-Objekts auf einen bestimmten DbType-Enumerationswert festgelegt wird. Zur Unterstützung der Datentypen datetime2 und datetimeoffset wurden DbType die im Folgenden aufgeführten Enumerationswerte hinzugefügt:

  • 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 Datenbank-NULL-Werten finden Sie unter Behandeln von NULL-Werten.
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 Ruft die Anzahl der Dezimalstellen für die Auflösung des Uhrzeitteils des Werts für Time, DateTime2 und DateTimeOffset ab, oder legt diese fest. Der Standardwert ist 0, was bedeutet, dass die tatsächliche Skala vom Wert hergeleitet und an den Server gesendet wird.
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

Sie können ein SqlParameter-Objekt erstellen, indem Sie dessen Konstruktor verwenden, oder Sie fügen es zu einer SqlCommandParameters-Auflistung hinzu, indem Sie die Add-Methode der SqlParameterCollection aufrufen. Die Add-Methode verwendet als Eingabe 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 DataAdapter-Parametern.

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-02 1:00:00+0");  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@DateTimeOffSet"  
parameter.SqlDbType = SqlDbType.DateTimeOffSet  
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");  

AddWithValue

Sie können Parameter auch mithilfe der AddWithValue-Methode von SqlCommand angeben, wie im folgenden Codefragment gezeigt. Die AddWithValue-Methode ermöglicht jedoch nicht, DbType oder SqlDbType für den Parameter anzugeben.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("16660902"));  
command.Parameters.AddWithValue( _  
    "@date", DateTimeOffset.Parse("16660902"))  

Der @date-Parameter kann den Datentypen date, datetime oder datetime2 auf dem Server zugewiesen werden. Wenn Sie mit den neuen datetime-Datentypen arbeiten, müssen Sie die SqlDbType-Eigenschaft des Parameters explizit auf den Datentyp der Instanz festlegen. Das Verwenden von Variant oder implizite Bereitstellen von Parameterwerten kann zu Problemen bei der Abwärtskompatibilität der Datentypen datetime und smalldatetime führen.

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

CLR-Datentyp Abgeleiteter 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-Struktur ab.
GetDateTimeOffset Ruft den angegebenen Spaltenwert als DateTimeOffset-Struktur ab.
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. Eine InvalidCastException tritt auf, 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. Eine InvalidCastException tritt auf, wenn die Daten nicht als Zeichenfolge ausgedrückt werden können.
GetTimeSpan Ruft den angegebenen Spaltenwert als TimeSpan-Struktur ab.
GetValue Ruft den angegebenen Spaltenwert als zugrunde liegenden CLR-Typ ab.
GetValues Ruft Spaltenwerte in einem Array ab.
GetSchemaTable Gibt eine DataTable zurück, die die Metadaten des Resultsets beschreibt.

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 angeben, indem Sie eine Vielzahl verschiedener Formate für Literalzeichenfolgen verwenden, die SQL Server dann zur Laufzeit auswertet und 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 zum Arbeiten mit Datums- und Uhrzeitwerten in SQL Server finden Sie in den 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 Systemdatentypen in SQL Server.

Weitere Informationen