datetime2 (Transact-SQL)

Gilt für: SQL Server (alle unterstützten Versionen) Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Definiert ein Datum, das mit einer Uhrzeit kombiniert ist und auf dem 24-Stunden-Format basiert. datetime2 kann als eine Erweiterung des bestehenden datetime-Typs angesehen werden, der einen größeren Datumsbereich, eine größere Standardgenauigkeit bei Sekundenbruchteilen und eine optionale vom Benutzer angegebene Genauigkeit besitzt.

datetime2-Beschreibung

Eigenschaft Wert
Syntax datetime2 [ (Genauigkeit in Sekundenbruchteilen) ]
Verwendung DECLARE @MyDatetime2 datetime2(7)

CREATE TABLE Table1 ( Column1 datetime2(7) )
Standardmäßiges Format der Zeichenfolgenliterale

(wird zum Zweck der Clientkompatibilität verwendet)
YYYY-MM-DD hh:mm:ss [.Sekundenbruchteile]

Weitere Informationen finden Sie im nachfolgenden Abschnitt „Abwärtskompatibilität für Downlevelclients“.
Datumsbereich 0001-01-01 bis 9999-12-31

1. Januar 1 n. Chr. bis 31. Dezember 9999 n. Chr.
Uhrzeitbereich 00:00:00 bis 23:59:590,9999999
Zeitzonenoffsetbereich Keine
Elementbereiche Bei YYYY handelt es sich um eine vierstellige Zahl im Bereich von 0001 bis 9999, die ein Jahr darstellt.

Bei MM handelt es sich um eine zweistellige Zahl im Bereich von 01 bis 12, die im angegebenen Jahr einen Monat darstellt.

Bei DD handelt es sich um eine zweistellige Zahl im Bereich von 01 bis 31, die im angegebenen Monat einen Tag darstellt.

Bei hh handelt es sich um eine zweistellige Zahl im Bereich von 00 bis 23, die die Stunde darstellt.

Bei mm handelt es sich um eine zweistellige Zahl im Bereich von 00 bis 59, die die Minute darstellt.

Bei ss handelt es sich um eine zweistellige Zahl im Bereich von 00 bis 59, die die Sekunde darstellt.

Bei n* handelt es sich um eine null- bis siebenstellige Zahl von 0 bis 9999999, die die Sekundenbruchteile darstellt. In Informatica werden die Sekundenbruchteile abgeschnitten, wenn n > 3.
Zeichenlänge Mindestens 19 Positionen (YYYY-MM-DD hh:mm:ss) bis maximal 27 Positionen (YYYY-MM-DD hh:mm:ss .0000000)
Genauigkeit, Dezimalstellen 0 bis 7 Stellen mit einer Genauigkeit von 100 ns. Die Standardgenauigkeit beträgt 7 Stellen.
Speichergröße 1 6 Byte für Genauigkeiten unter 3.
7 Byte für Genauigkeiten von 3 und 4.
Alle anderen Genauigkeiten erfordern 8 Byte.2
Genauigkeit 100 Nanosekunden
Standardwert 1900-01-01 00:00:00
Kalender Gregorianisch
Benutzerdefinierte Genauigkeit in Sekundenbruchteilen Ja
Beachtung und Beibehaltung des Zeitzonenoffsets Nein
Beachtung der Sommerzeit Nein

1 Bereitgestellte Werte gelten für den nicht komprimierten Rowstore-Index. Bei der Verwendung der Datenkomprimierung oder von Columnstore-Indizes kann sich die Speichergröße der Genauigkeiten ändern. Außerdem kann sich die Speichergröße auf dem Datenträger von der im Arbeitsspeicher unterscheiden. So benötigen datetime2-Werte immer 8 Byte Arbeitsspeicher, wenn der Batchmodus verwendet wird.

2 Wenn ein datetime2-Wert in einen varbinary-Wert umgewandelt wird, wird dem varbinary-Wert ein zusätzliches Byte hinzugefügt, um die Genauigkeit zu speichern.

Metadaten von Datentypen finden Sie unter sys.systypes (Transact-SQL) oder TYPEPROPERTY (Transact-SQL). Für einige Datums- und Uhrzeitdatentypen sind die Genauigkeit und die Dezimalstellenanzahl variabel. Informationen zum Abrufen von Genauigkeit und Einteilung für eine Spalte finden Sie unter COLUMNPROPERTY (Transact-SQL), COL_LENGTH (Transact-SQL) oder sys.columns (Transact-SQL).

Unterstützte Formate der Zeichenfolgenliterale für datetime2

In den folgenden Tabellen werden die unterstützten ISO 8601- und ODBC-Formate für Zeichenfolgenliterale für datetime2 aufgelistet. Informationen zu alphabetischen, numerischen, nicht getrennten Formaten sowie zu Zeitformaten für die Datums- und Uhrzeitbestandteile von datetime2 finden Sie unter date (Transact-SQL) und time (Transact-SQL).

ISO 8601 Beschreibungen
YYYY-MM-DDThh:mm:ss[.nnnnnnn]

YYYY-MM-DDThh:mm:ss[.nnnnnnn]
Dieses Format wird nicht von den SET LANGUAGE- und SET DATEFORMAT-Gebietsschemaeinstellungen für Sitzungen beeinflusst. Das T, die Doppelpunkte (:) und der Punkt (.) werden in das Zeichenfolgenliteral eingeschlossen, z.B. '2007-05-02T19:58:47.1234567'.
ODBC BESCHREIBUNG
{ ts 'yyyy-mm-dd hh:mm:ss[.Sekundenbruchteile]' } ODBC-API-spezifisch:

Für die Anzahl der Stellen rechts vom Dezimaltrennzeichen, die den Sekundenbruchteil darstellen, kann 0 bis 7 (100 Nanosekunden) angegeben werden.

Kompatibilität mit ANSI und ISO 8601

Die Kompatibilität mit ANSI und ISO 8601 von date und time gilt auch für datetime2.

Abwärtskompatibilität für Downlevelclients

Einige Downlevelclients unterstützen nicht die Datentypen time, date, datetime2 und datetimeoffset. In der folgenden Tabelle wird die Typzuordnung zwischen einer Instanz höherer Ebene in SQL Server und Downlevelclients gezeigt.

SQL Server-Datentyp Standardmäßiges Format des an Downlevelclients übergebenen Zeichenfolgenliterals ODBC früherer Versionen OLEDB früherer Versionen JDBC früherer Versionen SQLCLIENT früherer Versionen
time hh:mm:ss[.nnnnnnn] SQL_WVARCHAR oder SQL_VARCHAR DBTYPE_WSTR oder DBTYPE_STR Java.sql.String Zeichenfolge oder SqString
date JJJJ-MM-TT SQL_WVARCHAR oder SQL_VARCHAR DBTYPE_WSTR oder DBTYPE_STR Java.sql.String Zeichenfolge oder SqString
datetime2 YYYY-MM-DD hh:mm:ss[.nnnnnnn] SQL_WVARCHAR oder SQL_VARCHAR DBTYPE_WSTR oder DBTYPE_STR Java.sql.String Zeichenfolge oder SqString
datetimeoffset YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm SQL_WVARCHAR oder SQL_VARCHAR DBTYPE_WSTR oder DBTYPE_STR Java.sql.String Zeichenfolge oder SqString

Konvertieren von Datums- und Uhrzeitdaten

Beim Konvertieren in date- und time-Datentypen lehnt SQL Server alle Werte ab, die nicht als Datum oder Uhrzeit erkannt werden. Informationen zur Verwendung der Funktionen CAST und CONVERT mit Datums- und Uhrzeitdaten finden Sie unter CAST und CONVERT (Transact-SQL).

Konvertieren anderer Datums- und Uhrzeittypen in datetime2-Datentyp

Der folgende Abschnitt veranschaulicht die Abläufe bei der Konvertierung von anderen Datums- und Uhrzeitdatentypen in den Datentyp datetime2.

Beim Konvertieren in date werden das Jahr, der Monat und der Tag kopiert. Die Zeitkomponente wird auf 00:00:00.0000000 festgelegt. Der folgende Code zeigt die Ergebnisse der Konvertierung eines date-Werts in einen datetime2-Wert.

DECLARE @date date = '12-21-16';
DECLARE @datetime2 datetime2 = @date;

SELECT @datetime2 AS '@datetime2', @date AS '@date';
  
--Result  
--@datetime2                  @date
----------------------------- ----------
--2016-12-21 00:00:00.0000000 2016-12-21

Beim Konvertieren von time(n) wird die Zeitkomponente kopiert, und die Datumskomponente wird auf „1900-01-01“ festgelegt. Das folgende Beispiel zeigt die Ergebnisse der Konvertierung eines time(7)-Werts in einen datetime2-Wert.

DECLARE @time time(7) = '12:10:16.1234567';
DECLARE @datetime2 datetime2 = @time;

SELECT @datetime2 AS '@datetime2', @time AS '@time';
  
--Result  
--@datetime2                  @time
----------------------------- ----------------
--1900-01-01 12:10:16.1234567 12:10:16.1234567

Wenn die Konvertierung von samlldatetime erfolgt, werden die Stunden und Minuten kopiert. Die Sekunden und die Sekundenbruchteile werden auf 0 festgelegt. Der folgende Code zeigt die Ergebnisse der Konvertierung eines smalldatetime-Werts in einen datetime2-Wert.

DECLARE @smalldatetime smalldatetime = '12-01-16 12:32';
DECLARE @datetime2 datetime2 = @smalldatetime;

SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime'; 
  
--Result  
--@datetime2                  @smalldatetime
----------------------------- -----------------------
--2016-12-01 12:32:00.0000000 2016-12-01 12:32:00 

Wenn die Konvertierung von datetimeoffset(n) erfolgt, werden die Datums- und Uhrzeitkomponenten kopiert. Die Zeitzone wird abgeschnitten. Das folgende Beispiel zeigt die Ergebnisse der Konvertierung eines datetimeoffset(7)-Werts in einen datetime2-Wert.

DECLARE @datetimeoffset datetimeoffset(7) = '2016-10-23 12:45:37.1234567 +10:0';
DECLARE @datetime2 datetime2 = @datetimeoffset;

SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset'; 
  
--Result  
--@datetime2                  @datetimeoffset
----------------------------- ----------------------------------
--2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00

Wenn die Konvertierung von datetime erfolgt, werden Datum und Uhrzeit kopiert. Die Genauigkeit der Sekundenbruchteile wird auf 7 Dezimalstellen erweitert. Das folgende Beispiel zeigt die Ergebnisse der Konvertierung eines datetime-Werts in einen datetime2-Wert.

DECLARE @datetime datetime = '2016-10-23 12:45:37.333';
DECLARE @datetime2 datetime2 = @datetime;

SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
   
--Result  
--@datetime2                  @datetime
------------------------- ---------------------------
--2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

Hinweis

Unter dem Datenbankkompatibilitätsgrad 130 ergibt sich bei einer impliziten Konvertierung aus dem Datentyp „datetime“ in den Datentyp „datetime2“ eine verbesserte Genauigkeit, indem die Bruchteile von Millisekunden berücksichtigt werden, wodurch sich unterschiedliche konvertierte Werte ergeben, wie es im Beispiel oben zu sehen ist. Verwenden Sie explizite Umwandlung in den Datentyp „datetime2“, wenn ein Vergleich so gestaltet ist, dass zwischen den Datentypen „datetime“ und „datetime2“ verglichen wird. Weitere Informationen finden Sie im folgenden Microsoft-Support-Artikel.

Konvertieren von Zeichenfolgenliteralen in datetime2

Konvertierungen von Zeichenfolgenliteralen in Datums- und Zeitwerte sind erlaubt, wenn alle Teile der Zeichenfolge in gültigen Formaten vorliegen. Andernfalls wird ein Laufzeitfehler ausgelöst. Wird bei impliziten oder expliziten Konvertierungen von Datums- und Zeitwerten in Zeichenfolgenliterale kein Stil angegeben, wird das Standardformat der aktuellen Sitzung verwendet. In der folgenden Tabelle werden die Regeln zum Konvertieren eines Zeichenfolgenliterals in den datetime2-Datentyp dargestellt.

Eingabezeichenfolgenliteral datetime2(n)
ODBC DATE Dem datetime-Datentyp werden ODBC-Zeichenfolgenliterale zugeordnet. Jede Zuweisungsoperation von ODBC DATETIME-Literalen zu datetime2-Typen bewirkt eine in den Konvertierungsregeln definierte implizite Konvertierung zwischen datetime und diesen Typen.
ODBC TIME Siehe vorherige ODBC DATE-Regel.
ODBC DATETIME Siehe vorherige ODBC DATE-Regel.
Nur DATE Der TIME-Teil wird standardmäßig auf 00:00:00 festgelegt.
Nur TIME Der DATE-Teil wird standardmäßig auf 1900-1-1 festgelegt.
Nur TIMEZONE Standardwerte werden festgelegt.
DATE + TIME Trivial
DATE + TIMEZONE Nicht zulässig.
TIME + TIMEZONE Der DATE-Teil wird standardmäßig auf 1900-1-1 festgelegt. TIMEZONE-Eingabe wird ignoriert.
DATE + TIME + TIMEZONE Die lokale DATETIME wird verwendet.

Beispiele

Im folgenden Beispiel werden die Ergebnisse der Umwandlung von einer Zeichenfolge in alle date- und time-Datentypen verglichen.

SELECT   
     CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time'   
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date'   
    ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS   
        'smalldatetime'   
    ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime'   
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS   
        'datetime2'  
    ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS   
        'datetimeoffset';  

Hier ist das Resultset.

Datentyp Output
time 12:35:29.1234567
date 2007-05-08
smalldatetime 2007-05-08 12:35:00
datetime 2007-05-08 12:35:29.123
datetime2 2007-05-08 12:35:29.1234567
datetimeoffset 2007-05-08 12:35:29.1234567 +12:15

Weitere Informationen

CAST und CONVERT (Transact-SQL)