Dela via


Datum- och tidsdata

SQL Server 2008 introducerar nya datatyper för hantering av datum- och tidsinformation. De nya datatyperna innehåller separata typer för datum och tid och expanderade datatyper med större intervall, precision och tidszonsmedvetenhet. Från och med .NET Framework version 3.5 Service Pack (SP) 1 ger .NET Framework Data Provider för SQL Server (System.Data.SqlClient) fullständigt stöd för alla nya funktioner i SQL Server 2008 Database Engine. Du måste installera .NET Framework 3.5 SP1 (eller senare) för att kunna använda dessa nya funktioner med SqlClient.

Versioner av SQL Server tidigare än SQL Server 2008 hade bara två datatyper för att arbeta med datum- och tidsvärden: datetime och smalldatetime. Båda dessa datatyper innehåller både datumvärdet och ett tidsvärde, vilket gör det svårt att arbeta med endast datum- eller endast tidsvärden. Dessutom stöder dessa datatyper endast datum som inträffar efter introduktionen av den gregorianska kalendern i England 1753. En annan begränsning är att dessa äldre datatyper inte är tidszonsmedvetna, vilket gör det svårt att arbeta med data som kommer från flera tidszoner.

Mer information om datum- och tidstyper i SQL Server finns i Datatyper och funktioner för datum och tid.

Datatyper för datum/tid som introduceras i SQL Server 2008

I följande tabell beskrivs de nya datatyperna för datum och tid.

SQL Server-datatyp beskrivning
date Datatypen date har ett intervall på 1 januari 01 till 31 december 9999 med en noggrannhet på 1 dag. Standardvärdet är 1 januari 1900. Lagringsstorleken är 3 byte.
time Datatypen time lagrar endast tidsvärden baserat på en 24-timmarsklocka. Datatypen time har ett intervall på 00:00:00.0000000 till 23:59:59.999999999 med en noggrannhet på 100 nanosekunder. Standardvärdet är 00:00:00.00000000 (midnatt). Datatypen time stöder användardefinierad bråkdels sekundprecision och lagringsstorleken varierar från 3 till 6 byte, baserat på den angivna precisionen.
datetime2 Datatypen datetime2 kombinerar intervallet och precisionen för datatyperna date och time till en enda datatyp.

Standardvärdena och strängliteralformaten är desamma som de som definieras i datatyperna date och time .
datetimeoffset Datatypen datetimeoffset har alla funktioner datetime2 i med en extra tidszonsförskjutning. Tidszonsförskjutningen representeras som [+|-] HH:MM. HH är två siffror från 00 till 14 som representerar antalet timmar i tidszonsförskjutningen. MM är 2 siffror från 00 till 59 som representerar antalet ytterligare minuter i tidszonsförskjutningen. Tidsformat stöds för 100 nanosekunder. Det obligatoriska tecknet + eller - anger om tidszonsförskjutningen läggs till eller subtraheras från UTC (Universal Time Coordinate eller Greenwich Mean Time) för att hämta den lokala tiden.

Kommentar

Mer information om hur du använder nyckelordet finns i Type System VersionConnectionString.

Datumformat och datumordning

Hur SQL Server parsar datum- och tidsvärden beror inte bara på typsystemversion och serverversion, utan även på serverns standardspråk och formatinställningar. En datumsträng som fungerar för datumformaten för ett språk kan vara oigenkännlig om frågan körs av en anslutning som använder en annan språk- och datumformatinställning.

Transact-SQL SET LANGUAGE-instruktionen anger implicit datumformatet som avgör ordningen på datumdelarna. Du kan använda SET DATEFORMAT Transact-SQL-instruktionen på en anslutning för att skilja datumvärden genom att beställa datumdelarna i MDY-, DMY-, YMD-, YDM-, MYD- eller DYM-ordning.

Om du inte anger något DATEFORMAT för anslutningen använder SQL Server det standardspråk som är associerat med anslutningen. Till exempel tolkas en datumsträng med "01/02/03" som MDY (2 januari 2003) på en server med en språkinställning på USA engelska, och som DMY (1 februari 2003) på en server med en språkinställning på brittisk engelska. Året bestäms med hjälp av SQL Server-regeln för brytår, som definierar slutdatumet för tilldelning av talets värde. Mer information finns i tvåsiffrigt alternativ för årsavstängning.

Kommentar

YDM-datumformatet stöds inte när du konverterar från ett strängformat till date, time, datetime2eller datetimeoffset.

Mer information om hur SQL Server tolkar datum- och tidsdata finns i Använda datum- och tidsdata.

Datatyper och parametrar för datum/tid

Följande uppräkningar har lagts till för att SqlDbType stödja de nya datum- och tidsdatatyperna.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffSet

Du kan ange datatypen för en SqlParameter med hjälp av någon av föregående SqlDbType uppräkningar.

Kommentar

Du kan inte ange DbType egenskapen för en SqlParameter till SqlDbType.Date.

Du kan också ange typen av ett SqlParameter generiskt objekt genom att ange DbType egenskapen för ett SqlParameter objekt till ett visst DbType uppräkningsvärde. Följande uppräkningsvärden har lagts till DbType för att stödja datatyperna datetime2 och datetimeoffset :

  • DbType.DateTime2

  • DbType.DateTimeOffset

Dessa nya uppräkningar kompletterar uppräkningarna Date, Timeoch DateTime som fanns i tidigare versioner av .NET Framework.

Dataprovidertypen .NET Framework för ett parameterobjekt härleds från .NET Framework-typen för parameterobjektets värde eller från DbType parameterobjektet. Inga nya System.Data.SqlTypes datatyper har introducerats för att stödja de nya datum- och tidsdatatyperna. I följande tabell beskrivs mappningarna mellan datum- och tidsdatatyperna för SQL Server 2008 och CLR-datatyperna.

SQL Server-datatyp .NET Framework-typ System.Data.SqlDbType System.Data.DbType
datum System.DateTime Datum Datum
time System.TimeSpan Tid Tid
datetime2 System.DateTime DateTime2 DateTime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
datetime System.DateTime Datum/tid Datum/tid
smalldatetime System.DateTime Datum/tid Datum/tid

Egenskaper för SqlParameter

I följande tabell beskrivs SqlParameter egenskaper som är relevanta för datum- och tidsdatatyper.

Property beskrivning
IsNullable Hämtar eller anger om ett värde är nullbart. När du skickar ett null-parametervärde till servern måste du ange DBNull, i stället null för (Nothing i Visual Basic). Mer information om null-databaser finns i Hantera nullvärden.
Precision Hämtar eller anger det maximala antalet siffror som används för att representera värdet. Den här inställningen ignoreras för datum- och tidsdatatyper.
Scale Hämtar eller anger antalet decimaler som tidsdelen av värdet matchas för Time, DateTime2och DateTimeOffset. Standardvärdet är 0, vilket innebär att den faktiska skalan härleds från värdet och skickas till servern.
Size Ignoreras för datatyper för datum och tid.
Value Hämtar eller anger parametervärdet.
SqlValue Hämtar eller anger parametervärdet.

Kommentar

Tidsvärden som är mindre än noll eller större än eller lika med 24 timmar genererar en ArgumentException.

Skapa parametrar

Du kan skapa ett SqlParameter objekt med hjälp av konstruktorn eller genom att lägga till det i en SqlCommandParameters samling genom att anropa Add metoden för SqlParameterCollection. Metoden Add tar som indata antingen konstruktorargument eller ett befintligt parameterobjekt.

Nästa avsnitt i det här avsnittet innehåller exempel på hur du anger datum- och tidsparametrar. Ytterligare exempel på hur du arbetar med parametrar finns i Konfigurera parametrar och Parameterdatatyper och DataAdapter-parametrar.

Datumexempel

Följande kodfragment visar hur du anger en date parameter.

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"  

Tidsexempel

Följande kodfragment visar hur du anger en time parameter.

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-exempel

Följande kodfragment visar hur du anger en datetime2 parameter med både datum- och tidsdelarna.

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-exempel

Följande kodfragment visar hur du anger en DateTimeOffSet parameter med ett datum, en tid och en tidszonsförskjutning på 0.

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

Du kan också ange parametrar med hjälp AddWithValue av metoden för en SqlCommand, som du ser i följande kodfragment. Metoden tillåter dock AddWithValue inte att du anger DbType eller SqlDbType för parametern.

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

Parametern @date kan mappas till en date, datetimeeller datetime2 datatyp på servern. När du arbetar med de nya datetime datatyperna måste du uttryckligen ange parameterns egenskap till instansens SqlDbType datatyp. Om du använder Variant eller implicit anger parametervärden kan det orsaka problem med bakåtkompatibilitet med datatyperna datetime och smalldatetime .

Följande tabell visar vilka som SqlDbTypes härleds från vilka CLR-typer:

CLR-typ Härledd SqlDbType
Datum/tid SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

Hämtar datum- och tidsdata

I följande tabell beskrivs metoder som används för att hämta datum- och tidsvärden för SQL Server 2008.

SqlClient-metod beskrivning
GetDateTime Hämtar det angivna kolumnvärdet som en DateTime struktur.
GetDateTimeOffset Hämtar det angivna kolumnvärdet som en DateTimeOffset struktur.
GetProviderSpecificFieldType Returnerar den typ som är den underliggande providerspecifika typen för fältet. Returnerar samma typer som GetFieldType för nya datum- och tidstyper.
GetProviderSpecificValue Hämtar värdet för den angivna kolumnen. Returnerar samma typer som GetValue för de nya datum- och tidstyperna.
GetProviderSpecificValues Hämtar värdena i den angivna matrisen.
GetSqlString Hämtar kolumnvärdet som en SqlString. Ett InvalidCastException inträffar om data inte kan uttryckas som en SqlString.
GetSqlValue Hämtar kolumndata som standard SqlDbType. Returnerar samma typer som GetValue för de nya datum- och tidstyperna.
GetSqlValues Hämtar värdena i den angivna matrisen.
GetString Hämtar kolumnvärdet som en sträng om typsystemversionen är inställd på SQL Server 2005. Ett InvalidCastException inträffar om data inte kan uttryckas som en sträng.
GetTimeSpan Hämtar det angivna kolumnvärdet som en TimeSpan struktur.
GetValue Hämtar det angivna kolumnvärdet som dess underliggande CLR-typ.
GetValues Hämtar kolumnvärden i en matris.
GetSchemaTable Returnerar en DataTable som beskriver metadata för resultatuppsättningen.

Kommentar

Det nya datumet och tiden SqlDbTypes stöds inte för kod som körs i processen i SQL Server. Ett undantag utlöses om någon av dessa typer skickas till servern.

Ange datum- och tidsvärden som literaler

Du kan ange datatyper för datum och tid med hjälp av olika literalsträngsformat, som SQL Server sedan utvärderar vid körning och konverterar dem till interna datum-/tidsstrukturer. SQL Server identifierar datum- och tidsdata som omges av enkla citattecken ('). Följande exempel visar några format:

  • Alfabetiska datumformat, till exempel 'October 15, 2006'.

  • Numeriska datumformat, till exempel '10/15/2006'.

  • Oförparerade strängformat, till exempel '20061015', som skulle tolkas som 15 oktober 2006 om du använder iso-standardformatet för datum.

Tidsvärden som är mindre än noll eller större än eller lika med 24 timmar genererar en ArgumentException.

SQL Server-dokumentresurser

Mer information om hur du arbetar med datum- och tidsvärden i SQL Server finns i följande artiklar.

Artikel beskrivning
Datatyper och funktioner för datum och tid (Transact-SQL) Ger en översikt över alla datatyper och funktioner för Transact-SQL-datum och tid.
Använda datum- och tidsdata Innehåller information om datatyper och funktioner för datum och tid samt exempel på hur du använder dem.
Datatyper (Transact-SQL) Beskriver systemdatatyper i SQL Server.

Se även