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 |
---|---|---|
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 |
---|---|
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). |
|
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. |
|
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. |
|
Dies wird für Datums- und Uhrzeitdatentypen ignoriert. |
|
Ruft den Parameterwert ab oder legt diesen fest. |
|
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 |
---|---|
Ruft den angegebenen Spaltenwert als DateTime-Struktur ab. |
|
Ruft den angegebenen Spaltenwert als DateTimeOffset-Struktur ab. |
|
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. |
|
Ruft den Wert der angegebenen Spalte ab. Gibt dieselben Typen wie GetValue für die neuen Datums- und Uhrzeittypen zurück. |
|
Ruft die Werte im angegebenen Array ab. |
|
Ruft den Spaltenwert als SqlString ab. Wenn die Daten nicht als SqlString ausgedrückt werden können, wird eine InvalidCastException ausgelöst. |
|
Ruft Spaltendaten als Standard-SqlDbType ab. Gibt dieselben Typen wie GetValue für die neuen Datums- und Uhrzeittypen zurück. |
|
Ruft die Werte im angegebenen Array ab. |
|
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. |
|
Ruft den angegebenen Spaltenwert als Timespan-Struktur ab. |
|
Ruft den angegebenen Spaltenwert als dessen zugrunde liegenden CLR-Typ ab. |
|
Ruft Spaltenwerte in einem Array ab. |
|
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. |
Enthält Informationen zu den Datentypen und Funktionen zur Angabe des Datums und der Uhrzeit sowie Beispiele für deren Verwendung. |
|
Beschreibt die Systemdatentypen in SQL Server 2008. |
Siehe auch
Konzepte
SQL Server-Datentypmappings (ADO.NET)
Konfigurieren von Parametern und Parameterdatentypen (ADO.NET)