Delen via


Datum (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Hiermee definieert u een datum in SQL Server. Het gegevenstype datum is geïntroduceerd in SQL Server 2008 (10.0.x).

Datumbeschrijving

Property Value
Syntax DATE
Usage DECLARE @MyDate DATE

CREATE TABLE Table1 (Column1 DATE)
Letterlijke standaardtekenreeksindeling

(gebruikt voor client op down-level)
yyyy-MM-dd

Zie de sectie Achterwaartse compatibiliteit voor clients op lager niveau voor meer informatie.
Range 0001-01-01 door 9999-12-31 (1582-10-15 door 9999-12-31 voor Informatica)

1 januari 1 CE (Common Era) tot en met 31 december 9999 CE (15 oktober 1582 CE tot en met 31 december 9999 CE voor Informatica)
Elementenbereiken yyyy is vier cijfers van 00019999 waaruit een jaar wordt weergegeven. Informatica beperkt yyyy zich tot het bereik 1582 tot 9999.

MM is twee cijfers van 01 tot 12 die een maand in het opgegeven jaar vertegenwoordigen.

dd is twee cijfers van 01 tot 31, afhankelijk van de maand, die een dag van de opgegeven maand vertegenwoordigt.
Tekenlengte 10 posities
Precisie, schaal 10, 0
Opslaggrootte 3 bytes, vast
Opslagstructuur een datum van 3 bytes voor gehele getallen
Accuracy Eén dag
Standaardwaarde 1900-01-01

Deze waarde wordt gebruikt voor het toegevoegde datumonderdeel voor impliciete conversie van tijd tot datum/tijd2 of datetimeoffset.
Calendar Gregorian
Door de gebruiker gedefinieerde tweede precisie No
Tijdzoneverschil bewust en behoud No
Zomertijdbewust No

Ondersteunde letterlijke notaties voor tekenreeksen voor datum

In de volgende lijsten worden de geldige letterlijke notaties voor tekenreeksen voor het datumgegevenstype weergegeven.

[m]m, dden [yy]yy vertegenwoordigen maand, dag en jaar in een tekenreeks met slashmarkeringen (/), afbreekstreepjes (-) of punten (.) als scheidingstekens.

Er worden slechts vier cijfers of tweecijferige jaren ondersteund. Gebruik waar mogelijk viercijferige jaren. Als u een geheel getal wilt opgeven van 0001 tot 9999 dat het grensjaar voor het interpreteren van tweecijferige jaren als viercijferige jaren, gebruikt u de optie voor de configuratie van de serverconfiguratie van twee cijfers .

Voor Informatica, yyyy is beperkt tot het bereik 1582 tot 9999.

Een jaar van twee cijfers dat kleiner is dan of gelijk is aan de laatste twee cijfers van het grensjaar, bevindt zich in dezelfde eeuw als het grensjaar. Een tweecijferig jaar dat groter is dan de laatste twee cijfers van het grensjaar, is in de eeuw die vóór het grensjaar valt. Als de grens tussen twee cijfers bijvoorbeeld de standaardwaarde 2049is, wordt het jaar 49 van twee cijfers geïnterpreteerd als 2049 en wordt het jaar 50 van twee cijfers geïnterpreteerd als 1950.

De huidige taalinstelling bepaalt de standaarddatumnotatie. U kunt de datumnotatie wijzigen met de instructies SET LANGUAGE en SET DATEFORMAT .

De ydm indeling wordt niet ondersteund voor datum.

Letterlijke notaties voor tekenreeksen voor maand-dag-jaar

SET DATEFORMAT mdy;
  • [m]m/dd/[yy]yy
  • [m]m-dd-[yy]yy

Letterlijke notatie van tekenreeksen voor maand-jaar-dag

SET DATEFORMAT myd;
  • [m]m/[yy]yy/dd
  • [m]m-[yy]yy-dd
  • [m]m.[yy]yy.dd

Letterlijke notaties voor tekenreeksen voor dag-maand-jaar

SET DATEFORMAT dmy;
  • dd/[m]m/[yy]yy
  • dd-[m]m-[yy]yy
  • dd.[m]m.[yy]yy

Letterlijke notatie van tekenreeksen voor dag-jaar-maand

SET DATEFORMAT dym;
  • dd/[yy]yy/[m]m
  • dd-[yy]yy-[m]m
  • dd.[yy]yy.[m]m

Letterlijke notatie van tekenreeksen voor jaar-maand-dag

SET DATEFORMAT ymd;
  • [yy]yy/[m]m/dd
  • [yy]yy-[m]m-dd
  • [yy]yy-[m]m-dd

Alfabetische lijst met notaties

  • [dd] mon[,] yyyy
  • dd mon[,][yy]yy
  • dd [yy]yy mon
  • [dd] yyyy mon
  • mon [dd][,] yyyy
  • mon dd[,] [yy]
  • mon yyyy [dd]
  • yyyy mon [dd]
  • yyyy [dd] mon

mon vertegenwoordigt de volledige maandnaam, of de afkorting van de maand, die in de huidige taal is opgegeven. Komma's zijn optioneel en hoofdlettergebruik wordt genegeerd.

Gebruik viercijferige jaren om dubbelzinnigheid te voorkomen.

Als de dag ontbreekt, wordt de eerste dag van de maand opgegeven.

ISO 8601-lijst met indelingen

  • yyyy-MM-dd
  • yyyyMMdd

Hetzelfde als de SQL-standaard. Deze indeling is de enige indeling die is gedefinieerd als een internationale standaard.

Niet-afgeschreven lijst met indelingen

  • [yy]yyMMdd
  • yyyy[MMdd]

De datumgegevens kunnen worden opgegeven met vier, zes of acht cijfers. Een tekenreeks van zes cijfers of acht cijfers wordt altijd geïnterpreteerd als ymd. De maand en dag moeten altijd twee cijfers zijn. Een tekenreeks met vier cijfers wordt geïnterpreteerd als het jaar.

ODBC-datumnotatie

  • { d 'yyyy-MM-dd' }

ODBC API-specifiek.

W3C XML-datumnotatie

  • yyyy-MM-ddTZD

Ondersteund voor XML/SOAP-gebruik.

TZDis de tijdzone-ontwerpator (Zof+hh:mm):-hh:mm

  • hh:mm vertegenwoordigt de tijdzone-offset. hh is twee cijfers, variërend van 0 tot 14, die het aantal uren in de tijdzone-offset vertegenwoordigen.

  • mm is twee cijfers, variërend van 0 tot 59, die het aantal extra minuten in de tijdzoneverschil vertegenwoordigen.

  • + (plus) of - (min) is het verplichte teken van de tijdzone-offset. Dit teken geeft aan dat, om de lokale tijd te verkrijgen, de tijdzone-offset wordt toegevoegd of afgetrokken van de UTC-tijd (Coordinated Universal Times). Het geldige tijdzoneverschil is van -14:00 tot +14:00.

ANSI- en ISO 8601-naleving

datum voldoet aan de ANSI SQL-standaarddefinitie voor de Gregoriaanse kalender:

Met datum/tijd-gegevenstypen kunnen datums in de Gregoriaanse indeling worden opgeslagen in het datumbereik 0001-01-01 CE tot en met 9999-12-31 CE.

De letterlijke standaardnotatie voor tekenreeksen, die wordt gebruikt voor clients met een lager niveau, voldoet aan het standaardformulier van SQL dat is gedefinieerd als yyyy-MM-dd. Deze indeling is hetzelfde als de ISO 8601-definitie voor DATE.

Note

Voor Informatica is het bereik beperkt tot 1582-10-15 (15 oktober 1582 CE) tot 9999-12-31 (31 december 9999 CE).

Compatibiliteit met eerdere versies voor clients met een lager niveau

Sommige downlevel clients bieden geen ondersteuning voor de gegevenstypen tijd, datum, datum/tijd2 en datetimeoffset . In de volgende tabel ziet u de typetoewijzing tussen een exemplaar op hoger niveau van SQL Server en clients op een lager niveau.

SQL Server-gegevenstype Standaardtekenreeks letterlijke notatie doorgegeven aan client op down-level ODBC op lager niveau OLEDB op lager niveau Down-level JDBC Down-level SQLCLIENT
time hh:mm:ss[.nnnnnnn] SQL_WVARCHAR of SQL_VARCHAR DBTYPE_WSTR of DBTYPE_STR Java.sql.String String of SqString
date yyyy-MM-dd SQL_WVARCHAR of SQL_VARCHAR DBTYPE_WSTR of DBTYPE_STR Java.sql.String String of SqString
datetime2 yyyy-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR of SQL_VARCHAR DBTYPE_WSTR of DBTYPE_STR Java.sql.String String of SqString
datetimeoffset yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+ or -]hh:mm SQL_WVARCHAR of SQL_VARCHAR DBTYPE_WSTR of DBTYPE_STR Java.sql.String String of SqString

Datum- en tijdgegevens converteren

Wanneer u gegevenstypen converteert naar datum en tijd, weigert SQL Server alle waarden die niet worden herkend als datums of tijden. Zie CASTvoor informatie over het gebruik van de functies CONVERT en met datum- en tijdgegevens.

Datum converteren naar andere datum- en tijdtypen

In deze sectie wordt beschreven wat er gebeurt wanneer u een datumgegevenstype converteert naar andere datum- en tijdgegevenstypen.

Wanneer de conversie naar tijd(n) is, mislukt de conversie en wordt het foutbericht 206 gegenereerd:

Conflicterend type operand: datum is niet compatibel met tijd.

Als de conversie is naar datum/tijd, wordt het datumonderdeel gekopieerd. De volgende code toont de resultaten van het converteren van een datumwaarde naar een datum/tijd-waarde .

DECLARE @date AS DATE = '12-10-25';

DECLARE @datetime AS DATETIME = @date;

SELECT @date AS '@date',
       @datetime AS '@datetime';

Hier is het resultatenoverzicht.

@date      @datetime
---------- -----------------------
2025-12-10 2025-12-10 00:00:00.000

Wanneer de conversie is ingesteld op smalldatetime, bevindt de datumwaarde zich in het bereik van een smalldatetime, wordt het datumonderdeel gekopieerd en wordt het tijdonderdeel ingesteld op 00:00:00.000. Wanneer de datumwaarde buiten het bereik van een smalldatetime-waarde valt, wordt foutbericht 242 gegenereerd en wordt de waarde smalldatetime ingesteld op NULL:

De conversie van een datumgegevenstype naar een gegevenstype smalldatetime heeft geresulteerd in een buitenbereikwaarde.

De volgende code toont de resultaten van het converteren van een datumwaarde naar een smalldatetime-waarde .

DECLARE @date AS DATE = '1912-10-25';

DECLARE @smalldatetime AS SMALLDATETIME = @date;

SELECT @date AS '@date',
       @smalldatetime AS '@smalldatetime';

Hier is het resultatenoverzicht.

@date      @smalldatetime
---------- -------------------
1912-10-25 1912-10-25 00:00:00

Voor conversie naar datetimeoffset(n), wordt de datum gekopieerd en de tijd is ingesteld op 00:00.0000000 +00:00. De volgende code toont de resultaten van het converteren van een datumwaarde naar een datetimeoffset(3) -waarde.

DECLARE @date AS DATE = '1912-10-25';

DECLARE @datetimeoffset AS DATETIMEOFFSET (3) = @date;

SELECT @date AS '@date',
       @datetimeoffset AS '@datetimeoffset';

Hier is het resultatenoverzicht.

@date      @datetimeoffset
---------- ------------------------------
1912-10-25 1912-10-25 00:00:00.000 +00:00

Wanneer de conversie is ingesteld op datetime2(n),wordt het datumonderdeel gekopieerd en wordt het tijdonderdeel ingesteld op 00:00.000000. De volgende code toont de resultaten van het converteren van een datumwaarde naar een datum/tijd2(3) -waarde.

DECLARE @date AS DATE = '1912-10-25';

DECLARE @datetime2 AS DATETIME2 (3) = @date;

SELECT @date AS '@date',
       @datetime2 AS '@datetime2(3)';

Hier is het resultatenoverzicht.

@date      @datetime2(3)
---------- -----------------------
1912-10-25 1912-10-25 00:00:00.000

Letterlijke tekenreeksen converteren naar datum

Conversies van letterlijke tekenreeksen tot datum- en tijdtypen zijn toegestaan als alle delen van de tekenreeksen geldige notaties hebben. Anders wordt er een runtimefout gegenereerd. Impliciete conversies of expliciete conversies die geen stijl opgeven, van datum- en tijdtypen tot letterlijke tekenreeksen, hebben de standaardindeling van de huidige sessie. In de volgende tabel ziet u de regels voor het converteren van een letterlijke tekenreeks naar het gegevenstype datum .

Letterlijke invoertekenreeks date
ODBC-DATUM Letterlijke odbc-tekenreeksen worden toegewezen aan het gegevenstype datum/tijd . Elke toewijzingsbewerking van LETTERLIJKE ODBC DATETIME in een datumtype veroorzaakt een impliciete conversie tussen datum/tijd en het type dat door de conversieregels wordt gedefinieerd.
ODBC-TIJD Zie de vorige ODBC DATE-regel.
ODBC DATUM Zie de vorige ODBC DATE-regel.
ALLEEN DATUM Trivial
ALLEEN TIJD Standaardwaarden worden opgegeven.
Alleen TIJDZONE Standaardwaarden worden opgegeven.
DATUM + TIJD Het gedeelte DATE van de invoertekenreeks wordt gebruikt.
DATUM + TIJDZONE Niet toegestaan.
TIJD + TIJDZONE Standaardwaarden worden opgegeven.
DATUM + TIJD + TIJDZONE Het gedeelte DATE van lokale DATUM/tijd wordt gebruikt.

Examples

In het volgende voorbeeld worden de resultaten van het casten van een tekenreeks vergeleken met elk gegevenstype datum en tijd.

SELECT CAST ('2022-05-08 12:35:29.1234567 +12:15' AS TIME (7)) AS 'time',
       CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
       CAST ('2022-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
       CAST ('2022-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
       CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATETIME2 (7)) AS 'datetime2',
       CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET (7)) AS 'datetimeoffset';

Hier is het resultatenoverzicht.

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