Dela via


datetime2 (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Definierar ett datum som kombineras med en tid på dagen som baseras på 24-timmarsklocka. datetime2 kan betraktas som ett tillägg av den befintliga datetime-typen som har ett större datumintervall, en större standardfraktioneringsprecision och valfri användardefinierad precision.

datetime2 description

Property Value
Syntax datetime2 [ (precision för bråk sekunder) ]
Usage DECLARE @MyDatetime2 datetime2(7);
CREATE TABLE Table1 (Column1 datetime2(7));
Standardformat för strängliteral

(används för klient på nednivå)
yyyy-MM-dd HH:mm:ss[.nnnnnnn]

Mer information finns i Bakåtkompatibilitet för klienter på nednivå senare i den här artikeln.
Date range 0001-01-01 genom 9999-12-31

1 januari, 1 CE till 31 december 9999 CE
Time range 00:00:00 genom 23:59:59.9999999
Tidszonsförskjutningsintervall None
Element ranges yyyy är ett fyrsiffrigt tal, från 0001 till och med 9999, som representerar ett år.

MM är ett tvåsiffrigt tal som sträcker sig från 01 till 12, som representerar en månad under det angivna året.

dd är ett tvåsiffrigt tal, från 01 till 31 beroende på månad, som representerar en dag i den angivna månaden.

HH är ett tvåsiffrigt tal som sträcker sig från 00 till 23, som representerar timmen.

mm är ett tvåsiffrigt tal som sträcker sig från 00 till 59, som representerar minuten.

ss är ett tvåsiffrigt tal, från 00 till 59, som representerar det andra.

n* är ett noll- till sjusiffrigt tal från 0 till 9999999, som representerar bråksekunderna. I Informatica trunkeras bråksekunderna när n är mindre än 3.
Character length Minst 19 positioner (yyyy-MM-dd HH:mm:ss) till högst 27 (yyyy-MM-dd HH:mm:ss.0000000)
Precision, scale 0 till 7 siffror, med en noggrannhet på 100 nanosekunder (100 ns). Standardprecisionen är 7 siffror.

I Microsoft Fabric Data Warehouse kan den här precisionen vara ett heltal från 0 till 6, utan standard. Precision måste anges i Microsoft Fabric Data Warehouse.
Lagringsstorlek 1 6 byte för precision som är mindre än 3.
7 byte för precision 3 eller 4.

All annan precision kräver 8 byte. 2
Accuracy 100 nanoseconds
Default value 1900-01-01 00:00:00
Calendar Gregorian
Användardefinierad bråkdels sekundprecision Yes
Tidszonsförskjutningsmedveten och konservering No
Sommartidsmedveten No

1 Angivna värden är för okomprimerade radarkiv. Användning av datakomprimering eller columnstore kan ändra lagringsstorleken för varje precision. Dessutom kan lagringsstorleken på disken och i minnet skilja sig åt. Datetime2-värden kräver till exempel alltid 8 byte i minnet när batchläge används.

2 När ett datetime2-värde omvandlas till ett varbinary-värde läggs en extra byte till i varbinary-värdet för att lagra precision.

Information om metadata för datatyp finns i sys.systypes eller TYPEPROPERTY. Precision och skala är variabel för vissa datum- och tidsdatatyper. Information om hur du hämtar precisionen och skalan för en kolumn finns i COLUMNPROPERTY, COL_LENGTH eller sys.columns.

Strängliterala format som stöds för datetime2

I följande tabeller visas de ISO 8601- och ODBC-strängliteralformat som stöds för datetime2. Information om alfabetiska, numeriska, oparerade format och tidsformat för datum- och tidsdelarna för datetime2 finns i datum och tid.

ISO 8601 Descriptions
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] Det här formatet påverkas inte av nationella inställningar för SET LANGUAGE session och SET DATEFORMAT . T, kolonen (:) och perioden (.) ingår i strängliteralen, till exempel 2024-05-02T19:58:47.1234567.
ODBC Description
{ ts 'yyyy-MM-dd HH:mm:ss[.nnnnnnn]' } ODBC-API:et är specifikt:

Antalet siffror till höger om decimaltecknet, som representerar bråksekunderna, kan anges från 0 upp till 7 (100 nanosekunder).

ANSI- och ISO 8601-efterlevnad

ANSI- och ISO 8601-kompatibiliteten för datum och tid gäller för datetime2.

Bakåtkompatibilitet för klienter på nednivå

Vissa klienter på nednivå stöder inte datatyperna tid, datum, datetime2 och datetimeoffset . I följande tabell visas typmappningen mellan en instans på hög nivå av SQL Server och klienter på nednivå.

SQL Server-datatyp Standardformat för strängliteral som skickas till klient på nednivå Down-level ODBC Down-level OLEDB Down-level JDBC Down-level SQLCLIENT
time HH:mm:ss[.nnnnnnn] SQL_WVARCHAR eller SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Sträng eller SqString
date yyyy-MM-dd SQL_WVARCHAR eller SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Sträng eller SqString
datetime2 yyyy-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR eller SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Sträng eller SqString
datetimeoffset åååå-MM-dd HH:mm:ss[.nnnnnnn] [+|-]hh:mm SQL_WVARCHAR eller SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Sträng eller SqString

Konvertera datum- och tidsdata

När du konverterar till datatyper för datum och tid avvisar databasmotorn alla värden som den inte kan identifiera som datum eller tider. Information om hur du använder funktionerna CAST och CONVERT med datum- och tidsdata finns i CAST och CONVERT

Konvertera andra datum- och tidstyper till datatypen datetime2

I det här avsnittet beskrivs vad som händer när andra datatyper för datum och tid konverteras till datatypen datetime2 .

När konverteringen kommer från datumkopieras året, månaden och dagen. Tidskomponenten är inställd på 00:00:00.0000000. Följande kod visar resultatet av konvertering av ett date-värde till ett datetime2 värde.

DECLARE @date AS DATE = '12-21-16';

DECLARE @datetime2 AS DATETIME2 = @date;

SELECT @datetime2 AS '@datetime2',
       @date AS '@date';

Här är resultatet.

@datetime2                  @date
--------------------------- ----------
2016-12-21 00:00:00.0000000 2016-12-21

När konverteringen är från tid(n)kopieras tidskomponenten och datumkomponenten är inställd på 1900-01-01. I följande exempel visas resultatet av konverteringen av ett tidsvärde (7) till ett datetime2-värde .

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

DECLARE @datetime2 AS DATETIME2 = @time;

SELECT @datetime2 AS '@datetime2',
       @time AS '@time';

Här är resultatet.

@datetime2                  @time
--------------------------- ----------------
1900-01-01 12:10:16.1234567 12:10:16.1234567

När konverteringen kommer från smalldatetimekopieras timmar och minuter. Sekunderna och bråksekunderna är inställda på 0. Följande kod visar resultatet av konvertering av ett smalldatetime-värde till ett datetime2 värde.

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

DECLARE @datetime2 AS DATETIME2 = @smalldatetime;

SELECT @datetime2 AS '@datetime2',
       @smalldatetime AS '@smalldatetime';

Här är resultatet.

@datetime2                  @smalldatetime
--------------------------- -----------------------
2016-12-01 12:32:00.0000000 2016-12-01 12:32:00

När konverteringen kommer från datetimeoffset(n) kopieras datum- och tidskomponenterna. Tidszonen trunkeras. I följande exempel visas resultatet av konverteringen av ett datetimeoffset(7)-värde till ett datetime2 värde.

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

DECLARE @datetime2 AS DATETIME2 = @datetimeoffset;

SELECT @datetime2 AS '@datetime2',
       @datetimeoffset AS '@datetimeoffset';

Här är resultatet.

@datetime2                  @datetimeoffset
--------------------------- ----------------------------------
2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00

När konverteringen är från datetime kopieras datum och tid. Bråkprecisionen utökas till 7 siffror. I följande exempel visas resultatet av konverteringen av ett datetime-värde till ett datetime2 värde.

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

DECLARE @datetime2 AS DATETIME2 = @datetime;

SELECT @datetime2 AS '@datetime2',
       @datetime AS '@datetime';

Här är resultatet.

@datetime2                  @datetime
----------------------- ---------------------------
2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

Casta explicit till datetime2 när du använder datetime

Under databaskompatibilitetsnivå 130 och senare visar implicita konverteringar från datetime till datetime2 datatyper förbättrad noggrannhet genom att ta hänsyn till bråk millisekunderna, vilket resulterar i olika konverterade värden, enligt föregående exempel. Använd explicit gjutning till datatypen datetime2 när det finns ett blandat jämförelsescenario mellan datatyperna datetime och datetime2 . Mer information finns i FÖRBÄTTRINGAR av SQL Server och Azure SQL Database när det gäller hantering av vissa datatyper och ovanliga åtgärder.

Konvertera strängliteraler till datetime2

Konverteringar från strängliteraler till datum- och tidstyper tillåts om alla delar av strängarna är i giltiga format. Annars utlöses ett körningsfel. Implicita konverteringar eller explicita konverteringar som inte anger ett format, från datum- och tidstyper till strängliteraler är i standardformatet för den aktuella sessionen. I följande tabell visas reglerna för att konvertera en strängliteral till datatypen datetime2 .

Indatasträngliteral datetime2(n)
ODBC DATE ODBC-stränglitaraler mappas till datatypen datetime . Tilldelningsåtgärder från ODBC DATETIME literaler till datetime2-typer orsakar en implicit konvertering mellan datetime och den här typen enligt definitionen i konverteringsreglerna.
ODBC TIME Se föregående ODBC DATE regel.
ODBC DATETIME Se föregående ODBC DATE regel.
DATE bara Delen TIME är 00:00:00som standard .
TIME bara Delen DATE är 1900-01-01som standard .
TIMEZONE bara Standardvärden anges.
DATE + TIME Trivial.
DATE + TIMEZONE Not allowed.
TIME + TIMEZONE Delen DATE är som standard 1900-1-1. TIMEZONE indata ignoreras.
DATE + TIME + TIMEZONE Den lokala DATETIME används.

Examples

I följande exempel jämförs resultatet av gjutning av en sträng med varje datum och tid datatyp.

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';

Här är resultatet.

Data type 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