Sdílet prostřednictvím


Datums- und Uhrzeitdaten in SQL Server 2008 (ADO.NET)

Aktualisiert: November 2007

SQL Server 2008 enthält neue Datentypen zur Behandlung von Datums- und Uhrzeitinformationen. Die neuen Datentypen beinhalten separate Typen für Datum und Uhrzeit sowie erweiterte Datentypen mit einem größerem Bereich, höherer Präzision und Zeitzonenermittlung. 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 Features des SQL Server 2008-Datenbankmoduls. Sie müssen .NET Framework 3.5 SP1 (oder höher) installieren, um diese neuen Features mit SqlClient zu verwenden.

Versionen von SQL Server vor SQL Server 2008 verfügten nur über zwei Datentypen für Datums- und Uhrzeitwerte: datetime und smalldatetime. Diese beiden Datentypen enthalten sowohl einen Datumswert als auch einen Uhrzeitwert. Dadurch macht es schwierig, nur mit den Datums- oder nur mit den Uhrzeitwerten zu arbeiten. Außerdem werden nur Datumsangaben nach Einführung des gregorianischen Kalenders in England im Jahr 1753 unterstützt. Weiterhin berücksichtigen diese älteren Datums- und Uhrzeitdatentypen nicht die Zeitzone und erschweren dadurch das Arbeiten mit Daten aus verschiedenen Zeitzonen.

Die vollständige Dokumentation für SQL Server-Datentypen ist in der SQL Server-Onlinedokumentation verfügbar. In der folgenden Tabelle sind die versionsspezifischen Einsteigerthemen für Datums- und Uhrzeitdaten aufgeführt.

SQL Server 2000

SQL Server 2005

SQL Server 2008

datetime- und smalldatetime-Daten

Verwenden von Datums- und Zeitdaten

Verwenden von Datums- und Zeitdaten

Neue Datums-/Uhrzeitdaten in SQL Server 2008

In der folgenden Tabelle werden die neuen Datums- und Uhrzeitdatentypen 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 Bytes.

time

Der time-Datentyp speichert reine Uhrzeitwerte im 24-Stunden-Format. Der Bereich der gültigen Werte des time-Datentyps reicht von 00:00:00.0000000 bis 23:59:59.9999999 mit einer Genauigkeit von 100 Nanosekunden. Der Standardwert ist 00:00:00.0000000 Uhr, also Mitternacht. Der time-Datentyp unterstützt eine benutzerdefinierte Genauigkeit der Sekundenbruchteile, und die Speichergröße variiert je nach angegebener Genauigkeit zwischen 3 und 6 Bytes.

datetime2

Der datetime2-Datentyp fasst den Gültigkeitsbereich und die Genauigkeit der Datentypen date und time in einem Datentyp zusammen.

Die Standardwerte und Formate der Zeichenfolgenliterale sind identisch mit denen der Datentypen date und time.

datetimeoffset

Der datetimeoffset-Datentyp verfügt über alle Features von datetime2 und über einen zusätzlichen Zeitzonenoffset. Der Zeitzonenoffset wird wie folgt dargestellt: [+|-] HH:MM. "HH" sind zwei Ziffern im Bereich von 00 bis 14, die für die Anzahl der Stunden in der Zeitzonenangabe stehen. "MM" sind zwei Ziffern im Bereich von 00 bis 59, die zur Angabe der zusätzlichen Minuten in der Zeitzonenangabe dienen. Uhrzeitformate werden mit einer Genauigkeit von bis zu 100 Nanosekunden unterstützt. Das obligatorische Pluszeichen (+) oder Minuszeichen (-) in der Zeitzonenangabe gibt an, ob der jeweilige Wert zum UTC-Wert (Universal Time Coordinate, koordinierte Weltzeit, auch als "Greenwich Mean Time" bekannt) addiert oder von diesem subtrahiert werden muss, um die lokale Uhrzeit zu ermitteln.

Hinweis:

Wenn die Type System Version nicht explizit auf SQL Server 2008 oder den letzten Wert der Verbindungszeichenfolge festgelegt ist, werden datetime-Werte unter Verwendung des SQL Server 2005-Standardtypsystems verarbeitet. Weitere Informationen zur Verwendung der Type System Version-Schlüsselwörter finden Sie unter Neue Features in SQL Server 2008 (ADO.NET).

Datumsformat und Datumsreihenfolge

Wie Datums- und Zeitwerte von SQL Server analysiert werden, ist nicht nur von der Typsystemversion und der Serverversion abhängig, sondern auch von der Standardsprache und den Formateinstellungen des Servers. Eine Datumszeichenfolge, die für die Datumsformate einer bestimmten Sprache funktioniert, ist eventuell nicht erkennbar, wenn die Abfrage von einer Verbindung mit anderen Einstellungen für Sprache und Datumsformat ausgeführt wird.

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

Wenn Sie kein DATEFORMAT für die Verbindung angeben, verwendet SQL Server die der Verbindung zugewiesene Standardsprache. So wird beispielsweise eine Datumszeichenfolge von '01/02/03' auf einem Server mit Spracheinstellung "Englisch (USA)" als MDY (2. Januar 2003) und auf einem Server mit Englisch (britisch) als DMY (1. Februar 2003) interpretiert. Das Jahr wird durch die Umstellungsjahrregel von SQL Server festgestellt, die das Umstellungsdatum zum Zuweisen des Jahrhundertwerts definiert. Weitere Informationen finden Sie in der SQL Server-Onlinedokumentation unter two digit year cutoff (Option).

Hinweis:

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

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

Datentypen und Parameter zur Angabe von Datum und Uhrzeit

Sie können den Datentyp eines SqlParameter mithilfe einer der SqlDbType-Enumerationen angeben. Zur Unterstützung der neuen Datums- und Uhrzeitdatentypen wurden SqlDbType die folgenden Enumerationen hinzugefügt:

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffSet

Sie können den Typ eines SqlParameter auch generisch angeben, indem Sie die DbType-Eigenschaft eines SqlParameter-Objekts auf einen bestimmten DbType-Enumerationswert festlegen. 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. Zur Unterstützung der neuen Datums- und Uhrzeitdatentypen wurden keine neuen System.Data.SqlTypes-Datentypen hinzugefügt. Der folgenden Tabelle können Sie die Zuordnungen zwischen den Datentypen für die Datums- und Uhrzeitangabe in SQL Server 2008 und den entsprechenden CLR-Typen entnehmen.

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 die für Datums- und Uhrzeitdatentypen relevanten SqlParameter-Eigenschaften beschrieben.

Eigenschaft

Beschreibung

IsNullable

Ruft ab oder legt fest, ob ein NULL-Wert zulässig ist. Wenn Sie einen NULL-Parameterwert an den Server senden, müssen Sie DBNull und nicht null (in Visual Basic Nothing) angeben. Weitere Informationen zu NULL-Werten bei Datenbanken finden Sie unter Behandlung von NULL-Werten (ADO.NET).

Precision

Legt die maximale Anzahl von Ziffern fest, die zur Darstellung des Werts verwendet werden, oder ruft diese ab. Diese Einstellung wird für Datums- und Uhrzeitdatentypen ignoriert.

Scale

Legt die Anzahl der Dezimalstellen für die Auflösung des Uhrzeitteils des Werts für Time, DateTime2und DateTimeOffset fest. Der Standardwert ist 0, d. h., dass die tatsächliche Skalierung aus dem Wert hergeleitet und an den Server gesendet wird.

Size

Dies wird für Datums- und Uhrzeitdatentypen ignoriert.

Value

Ruft den Parameterwert ab oder legt diesen fest.

SqlValue

Ruft den Parameterwert ab oder legt diesen fest.

Hinweis:

Zeitwerte, die kleiner als 0 bzw. größer als 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 akzeptiert entweder Konstruktorargumente oder ein bestehendes Parameterobjekt als Eingabe.

Die nächsten Abschnitte in diesem Thema enthalten Beispiele über das Angeben von Datums- und Uhrzeitparametern. Weitere Beispiele zur Arbeit mit Parametern finden Sie unter Konfigurieren von Parametern und Parameterdatentypen (ADO.NET) und 'DataAdapter'-Parameter (ADO.NET)

Datumsbeispiel

Das folgende Codefragment zeigt, wie ein date-Parameter festgelegt 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 festgelegt 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 festgelegt 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 einem Zeitzonenoffset von 0 festgelegt wird.

        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 wie im folgenden Codefragment dargestellt mithilfe der AddWithValue-Methode eines SqlCommand angeben. Mit der AddWithValue-Methode können Sie jedoch nicht den DbType oder den SqlDbType als Parameter festlegen.

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. Die Verwendung von Variant oder die implizite Angabe von Parameterwerten kann Probleme bei der Abwärtskompatibilität mit den datetime- und smalldatetime-Datentypen verursachen.

In der folgende Tabelle ist dargestellt, welche SqlDbTypes von welchen CLR-Typen hergeleitet werden:

CLR-Typ

Hergeleiteter SqlDbType

DateTime

SqlDbType.DateTime

TimeSpan

SqlDbType.Time

DateTimeOffset

SqlDbType.DateTimeOffset

Abrufen von Datums- und Uhrzeitdaten

In der folgenden Tabelle werden 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 zugrunde liegenden anbieterspezifischen Typ für das Feld zurück. Gibt dieselben Typen wie GetFieldType für neue Datums- und Uhrzeittypen zurück.

GetProviderSpecificValue

Ruft den Wert der angegebenen Spalte ab. Gibt dieselben Typen wie GetValue für die neuen Datums- und Uhrzeittypen zurück.

GetProviderSpecificValues

Ruft die Werte im angegebenen Array ab.

GetSqlString

Ruft den Spaltenwert als SqlString ab. Wenn die Daten nicht als SqlString ausgedrückt werden können, wird eine InvalidCastException ausgelöst.

GetSqlValue

Ruft Spaltendaten als Standard-SqlDbType ab. Gibt dieselben Typen wie GetValue für die neuen Datums- und Uhrzeittypen zurück.

GetSqlValues

Ruft die Werte im angegebenen Array ab.

GetString

Ruft den Spaltenwert als Zeichenfolge ab, wenn Type System Version auf SQL Server 2000 oder SQL Server 2005 gesetzt ist. Wenn die Daten nicht als Zeichenfolge ausgedrückt werden können, wird eine InvalidCastException ausgelöst.

GetTimeSpan

Ruft den angegebenen Spaltenwert als Timespan-Struktur ab.

GetValue

Ruft den angegebenen Spaltenwert als dessen 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 neuen SqlDbTypes für Datum und Uhrzeit bieten keine Unterstützung für Code, der prozessintern in SQL Server ausgeführt wird. Wird einer dieser Typen an den Server übergeben, wird eine Ausnahme ausgelöst.

Angeben von Datums- und Uhrzeitwerten als Literale

Sie können Datums- und Zeitdatentypen mithilfe einer Vielzahl unterschiedlicher Formate für Literalzeichenfolgen angeben, die von SQL Server anschließend zur Laufzeit ausgewertet und in interne Datums-/Zeitstrukturen konvertiert werden. SQL Server erkennt Datums- und Uhrzeitdaten, die in einfache Anführungszeichen (') eingeschlossen werden. In den folgenden Beispielen werden einige Formate veranschaulicht:

  • Alphabetische Datumsformate, z. B. 'October 15, 2006'.

  • Numerische Datumsformate, beispielsweise '10/15/2006'.

  • Unstrukturierte Zeichenfolgenformate, wie '20061015'. Dieses Format wird als 15. Oktober 2006 interpretiert, wenn Sie das ISO-Standarddatumsformat verwenden.

Hinweis:

Eine vollständige Dokumentation zu allen Formaten für Literalzeichenfolgen und anderen Features der Datums- und Zeitdatentypen finden Sie in der SQL Server-Onlinedokumentation.

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

Ressourcen in der SQL Server 2008-Onlinedokumentation

Weitere Informationen zur Arbeit mit Datums- und Zeitwerten in SQL Server 2008 finden Sie in folgenden Ressourcen in der SQL Server 2008-Onlinedokumentation.

Thema

Beschreibung

Datentypen und Funktionen für die Angabe von Datum und Uhrzeit (Transact-SQL)

Bietet eine Übersicht über alle Transact-SQL-Datentypen und -Funktionen zur Angabe des Datums und der Uhrzeit.

Verwenden von Datums- und Uhrzeitdaten

Enthält Informationen zu den Datentypen und Funktionen zur Angabe des Datums und der Uhrzeit sowie Beispiele für deren Verwendung.

Datentypen (Transact-SQL)

Beschreibt die Systemdatentypen in SQL Server 2008.

Siehe auch

Konzepte

SQL Server-Datentypmappings (ADO.NET)

Konfigurieren von Parametern und Parameterdatentypen (ADO.NET)

Weitere Ressourcen

SQL Server-Datentypen und ADO.NET