Taal

Datum- en tijdgegevens

SQL Server 2008 introduceerde afzonderlijke gegevenstypen voor datum en tijd, en uitgebreide mogelijkheden voor gegevenstypen met meer bereik, precisie en tijdzonebewustzijn. Gebruik het Microsoft.Data.SqlClient NuGet-pakket voor toegang tot deze gegevenstypen vanuit clienttoepassingen. Importeer Microsoft.Data.SqlClient en System.Data in C# of Visual Basic voor de voorbeelden in dit artikel. De algemene SQL-waardetypen blijven in System.Data.SqlTypes.

Versies van SQL Server ouder dan SQL Server 2008 hadden slechts twee gegevenstypen voor het werken met datum- en tijdwaarden: datetime en smalldatetime. Beide gegevenstypen bevatten zowel de datumwaarde als een tijdwaarde, waardoor het lastig is om alleen datum- of alleen tijdwaarden te gebruiken. Deze gegevenstypen ondersteunen ook alleen datums die plaatsvinden na de introductie van de Gregoriaanse kalender in Engeland in 1753. Een andere beperking is dat deze oudere gegevenstypen geen tijdzonebewust zijn, waardoor het lastig is om te werken met gegevens die afkomstig zijn uit meerdere tijdzones.

Zie Datum- en tijdgegevenstypen en -functies voor meer informatie over datum- en tijdtypen in SQL Server.

Datum/tijd-gegevenstypen geïntroduceerd in SQL Server 2008

In de volgende tabel worden de nieuwe gegevenstypen voor datum en tijd beschreven.

SQL Server-gegevenstype Beschrijving
date Het date gegevenstype heeft een bereik van 1 januari 01 tot en met 31 december 9999 met een nauwkeurigheid van 1 dag. De standaardwaarde is 1 januari 1900. De opslaggrootte is 3 bytes.
time Het time gegevenstype slaat alleen tijdwaarden op, op basis van een 24-uurs klok. Het time gegevenstype heeft een bereik van 00:00:00.0000000 tot en met 23:59:59.99999999 met een nauwkeurigheid van 100 nanoseconden. De standaardwaarde is 00:00:00.0000000 (middernacht). Het time gegevenstype ondersteunt door de gebruiker gedefinieerde secondeprecisie en de opslaggrootte varieert van 3 tot 6 bytes, op basis van de opgegeven precisie.
datetime2 Het datetime2 gegevenstype combineert het bereik en de precisie van de date en time gegevenstypen in één gegevenstype.

De standaardwaarden en letterlijke tekenreeksindelingen zijn hetzelfde als de waarden die in de date en time gegevenstypen zijn gedefinieerd.
datetimeoffset Het datetimeoffset gegevenstype heeft alle functies van datetime2 met een extra tijdzone-offset. De tijdzone-offset wordt weergegeven als [+|-] UU:MM. UU is 2 cijfers variërend van 00 tot 14 die het aantal uren in het tijdzoneverschil aangeven. MM is 2 cijfers van 00 tot 59 die het aantal extra minuten in de tijdzone-offset vertegenwoordigen. Tijdnotaties worden ondersteund tot 100 nanoseconden. Het verplichte + of - teken geeft aan of de tijdzone-offset wordt toegevoegd of afgetrokken van UTC (Universal Time Coördinaat of Greenwich Mean Time) om de lokale tijd te verkrijgen.

Notitie

Zie voor meer informatie over het gebruik van het Type System Version trefwoord ConnectionString.

Datumnotatie en datumvolgorde

Hoe SQL Server datum- en tijdwaarden parseert, is niet alleen afhankelijk van de systeemversie en serverversie van het type, maar ook van de standaardtaal- en indelingsinstellingen van de server. Een datumtekenreeks die geschikt is voor de datumnotaties van één taal, kan onherkenbaar zijn als de query wordt uitgevoerd door een verbinding die gebruikmaakt van een andere taal- en datumnotatieinstelling.

De Transact-SQL-instructie SET LANGUAGE stelt impliciet de DATEFORMAT in die de volgorde van de datumonderdelen bepaalt. U kunt de SET DATEFORMAT instructie Transact-SQL voor een verbinding gebruiken om datumwaarden eenduidig te maken door de datumonderdelen in de volgorde MDY, DMY, YMD, YDM, MYD of DYM te rangschikken.

Als u geen verbinding DATEFORMAT opgeeft, gebruikt SQL Server de standaardtaal die aan de verbinding is gekoppeld. Een datumtekenreeks van '01/02/03' wordt bijvoorbeeld geïnterpreteerd als MDY (2 januari 2003) op een server met een taalinstelling van Amerikaans-Engels, en als DMY (1 februari 2003) op een server met een taalinstelling van Brits Engels. Het jaar wordt bepaald door de cutoff year-regel van SQL Server te gebruiken, waarmee de afkapdatum wordt gedefinieerd voor het toewijzen van de eeuwwaarde. Zie de optie 'two digit year cutoff' voor meer informatie.

Notitie

De YDM datumnotatie wordt niet ondersteund bij het converteren van een tekenreeksindeling naar date, timedatetime2of datetimeoffset.

Zie Datum- en tijdgegevens gebruiken voor meer informatie over hoe SQL Server datum- en tijdgegevens interpreteert.

Datum-/tijdgegevenstypen en -parameters

De volgende opsommingen zijn toegevoegd aan SqlDbType om de nieuwe datum- en tijdgegevenstypen te ondersteunen.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffset

Als u het gegevenstype voor het SqlParameter object wilt opgeven, gebruikt u een van de voorgaande SqlDbType opsommingswaarden.

Notitie

U kunt de DbType eigenschap van een SqlParameter niet instellen op SqlDbType.Date.

Als u het parametertype algemeen wilt opgeven, stelt u de DbType eigenschap in op de DbType opsommingswaarde. De volgende DbType waarden ondersteunen de datetime2 en datetimeoffset gegevenstypen:

  • DbType.DateTime2

  • DbType.DateTimeOffset

Deze nieuwe opsommingen vormen een aanvulling op de Date, Timeen DateTime opsommingen, die bestonden in eerdere versies van .NET Framework.

Het .NET Framework-gegevensprovidertype van een parameterobject wordt afgeleid van het .NET Framework-type van de waarde van het parameterobject of van het DbType parameterobject. Er zijn geen nieuwe System.Data.SqlTypes gegevenstypen geïntroduceerd ter ondersteuning van de nieuwe datum- en tijdgegevenstypen. In de volgende tabel worden de toewijzingen tussen de datum- en tijdgegevenstypen van SQL Server 2008 en de CLR-gegevenstypen beschreven.

SQL Server-gegevenstype .NET Framework-type 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-eigenschappen

In de volgende tabel worden eigenschappen beschreven SqlParameter die relevant zijn voor datum- en tijdgegevenstypen.

Eigenschap Beschrijving
IsNullable Bepaalt of stelt in of een waarde nulbaar is. Wanneer u een null-parameterwaarde naar de server verzendt, moet u DBNull opgeven in plaats van null (Nothing in Visual Basic). Zie Null-waarden verwerken voor meer informatie over database-null-waarden.
Precision Hiermee wordt het maximum aantal cijfers opgehaald of ingesteld dat wordt gebruikt om de waarde weer te geven. Deze instelling wordt genegeerd voor gegevenstypen voor datum en tijd.
Scale Haalt breuk-secondeprecisie op of stelt deze in voor Time, DateTime2en DateTimeOffset. Als u de schaal niet expliciet instelt, verzendt het stuurprogramma een schaal van 7. Door de schaal expliciet op 0 in te stellen, vraagt u om nul cijfers voor fractionele seconden.
Size Genegeerd voor datum- en tijdgegevenstypen.
Value Hiermee haalt u de parameterwaarde op of stelt u deze in.
SqlValue Hiermee haalt u de parameterwaarde op of stelt u deze in.

Notitie

Tijdwaarden die kleiner zijn dan nul of groter dan of gelijk aan 24 uur, geven een ArgumentException.

Parameters maken

Maak SqlParameter-objecten met de constructor of roep de methode Add aan in de Parameters-verzameling van de opdracht. De Add methode accepteert constructorargumenten of een bestaand parameterobject.

De volgende secties in dit onderwerp bevatten voorbeelden van het opgeven van datum- en tijdparameters. Zie Parameters en parametergegevenstypen en DataAdapter-parameters configureren voor meer voorbeelden van het werken met parameters.

Voorbeeld van datum

Het volgende codefragment laat zien hoe u een date parameter opgeeft.

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"

Voorbeeld van Tijd

Het volgende codefragment laat zien hoe u een time parameter opgeeft.

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

Datum/tijd2-voorbeeld

Het volgende codefragment laat zien hoe u een datetime2 parameter opgeeft met zowel de datum- als tijdonderdelen.

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

Het volgende codefragment laat zien hoe u een DateTimeOffset parameter met een datum, een tijd en een tijdzoneverschil van 0 opgeeft.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@DateTimeOffSet";
parameter.SqlDbType = SqlDbType.DateTimeOffset;
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@DateTimeOffSet"
parameter.SqlDbType = SqlDbType.DateTimeOffset
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00")

AddWithValue

Als u parameters wilt opgeven, kunt u ook Parameters aanroepen voor de verzameling AddWithValue van de opdracht, zoals wordt weergegeven in het volgende codefragment. AddWithValue U kunt echter niet de DbType of SqlDbType voor de parameter opgeven.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"));
command.Parameters.AddWithValue( _
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"))

Voor deze DateTimeOffset waarde leidt AddWithValueSqlDbType.DateTimeOffset af. Als u een ander SQL Server-datum- of -tijdtype wilt gebruiken, stelt u de eigenschap SqlDbType van de parameter expliciet in.

In de volgende tabel ziet u welke SqlDbTypes worden afgeleid van welke CLR-typen:

CLR-type Afgeleid SqlDbType
DateTime SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

Datum- en tijdgegevens ophalen

In de volgende tabel worden methoden beschreven die worden gebruikt voor het ophalen van datum- en tijdwaarden voor SQL Server 2008.

SqlClient-methode Beschrijving
GetDateTime Haalt de opgegeven kolomwaarde op als DateTime.
GetDateTimeOffset Haalt de opgegeven kolomwaarde op als DateTimeOffset.
GetProviderSpecificFieldType Retourneert het type dat het onderliggende providerspecifieke type van het veld is. Retourneert dezelfde typen als GetFieldType voor nieuwe datum- en tijdtypen.
GetProviderSpecificValue Haalt de waarde van de opgegeven kolom op. Retourneert dezelfde typen als GetValue voor de nieuwe datum- en tijdtypen.
GetProviderSpecificValues Haalt de waarden op in de opgegeven matrix.
GetSqlString Haalt de kolomwaarde op als SqlString. De methode genereert InvalidCastException als de gegevens niet kunnen worden uitgedrukt als SqlString.
GetSqlValue Haalt kolomgegevens op als standaard SqlDbType. Retourneert dezelfde typen als GetValue voor de nieuwe datum- en tijdtypen.
GetSqlValues Haalt de waarden op in de opgegeven matrix.
GetString Haalt de kolomwaarde op als een tekenreeks als de typesysteemversie is ingesteld op SQL Server 2005. De methode genereert InvalidCastException als de gegevens niet als een tekenreeks kunnen worden uitgedrukt.
GetTimeSpan Haalt de opgegeven kolomwaarde op als TimeSpan.
GetValue Haalt de opgegeven kolomwaarde op als het onderliggende CLR-type.
GetValues Haalt kolomwaarden op in een matrix.
GetSchemaTable Retourneert de metagegevens van de resultatenset in het DataTable object.

Notitie

De nieuwe datum en tijd SqlDbTypes worden niet ondersteund voor code die in verwerking wordt uitgevoerd in SQL Server. Er wordt een uitzondering gegenereerd als een van deze typen wordt doorgegeven aan de server.

Datum- en tijdwaarden opgeven als letterlijke waarden

U kunt gegevenstypen voor datum en tijd opgeven met behulp van verschillende letterlijke tekenreeksindelingen, die SQL Server vervolgens tijdens runtime evalueert en deze converteert naar interne datum-/tijdstructuren. SQL Server herkent datum- en tijdgegevens tussen enkele aanhalingstekens ('). In de volgende voorbeelden ziet u enkele indelingen:

  • Alfabetische datumnotaties, zoals 'October 15, 2006'.

  • Numerieke datumnotaties, zoals '10/15/2006'.

  • Niet-afgeschreven tekenreeksindelingen, zoals '20061015', die worden geïnterpreteerd als 15 oktober 2006 als u de ISO-standaarddatumnotatie gebruikt.

Tijdwaarden die kleiner zijn dan nul of groter dan of gelijk aan 24 uur, geven een ArgumentException.

SQL Server-documentatiebronnen

Zie de volgende artikelen voor meer informatie over het werken met datum- en tijdwaarden in SQL Server.

Artikel Beschrijving
Datum- en tijdgegevenstypen en -functies (Transact-SQL) Biedt een overzicht van alle Transact-SQL-datum- en tijdgegevenstypen en -functies.
Datum- en tijdgegevens gebruiken Bevat informatie over de datum- en tijdgegevenstypen en -functies en voorbeelden van het gebruik ervan.
Gegevenstypen (Transact-SQL) Beschrijft systeemgegevenstypen in SQL Server.

Zie ook