datetime (Transact-SQL)
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-database in Microsoft Fabric
Definieert een datum die wordt gecombineerd met een tijd van de dag met fractionele seconden die is gebaseerd op een 24-uurs klok.
Vermijd het gebruik van datum/tijd- voor nieuw werk. Gebruik in plaats daarvan de tijd, datum, datum/tijd2en datum/tijd-offset gegevenstypen. Deze typen zijn afgestemd op de SQL Standard en zijn draagbaarder. tijddatum/tijd2 en datum/tijdoffset meer seconden precisie bieden. datetimeoffset- biedt ondersteuning voor tijdzones voor wereldwijd geïmplementeerde toepassingen.
Beschrijving
Eigenschap | Waarde |
---|---|
syntaxis | DATETIME |
DECLARE @MyDatetime DATETIME; CREATE TABLE Table1 (Column1 DATETIME); |
|
standaardtekenreeks letterlijke notaties (gebruikt voor client op down-level) | Niet van toepassing |
datumbereik | 1753-01-01 (1 januari 1753) tot en met 9999-12-31 (31 december 9999) |
tijdsbereik | 00:00:00 tot en met 23:59:59.997 |
tijdzoneverschilbereik | Geen |
elementbereiken |
yyyy is vier cijfers van 1753 tot 9999 die een jaar vertegenwoordigen.MM is twee cijfers, variërend van 01 tot 12 , die een maand in het opgegeven jaar vertegenwoordigen.dd is twee cijfers, variërend van 01 tot 31 , afhankelijk van de maand, die een dag van de opgegeven maand vertegenwoordigt.HH is twee cijfers, variërend van 00 tot 23 , die het uur vertegenwoordigen.mm is twee cijfers, variërend van 00 tot 59 , die de minuut vertegenwoordigen.ss is twee cijfers, variërend van 00 tot 59 , die de tweede vertegenwoordigen.n* is nul tot drie cijfers, variërend van 0 tot 999 , die de fractionele seconden vertegenwoordigen. |
tekenlengte | 19 posities minimaal tot 23 maximum |
opslaggrootte | 8 bytes |
nauwkeurigheid | Afgerond op stappen van .000 , .003 of .007 seconden |
standaardwaarde | 1900-01-01 00:00:00 |
Agenda- | Gregoriaans (omvat het volledige bereik van jaren) |
door de gebruiker gedefinieerde tweede precisie | Nee |
tijdzone-offsetbewust en behoud | Nee |
zomertijdbewuste | Nee |
Ondersteunde letterlijke notaties voor tekenreeksen voor datum/tijd
De volgende tabellen bevatten de ondersteunde letterlijke notaties voor tekenreeksen voor datum/tijd-. Met uitzondering van ODBC staan datum/tijd letterlijke tekenreeksen tussen enkele aanhalingstekens ('
), bijvoorbeeld 'string_literaL'
. Als de omgeving niet is us_english
, moeten de letterlijke tekenreeksen de Unicode-indeling hebben N'string_literaL'
.
Numerieke notatie
U kunt datumgegevens opgeven met een numerieke maand opgegeven.
5/20/97
vertegenwoordigt bijvoorbeeld de twintigste dag van mei 1997. Wanneer u een numerieke datumnotatie gebruikt, geeft u de maand, dag en het jaar op in een tekenreeks die slashmarkeringen (/
), afbreekstreepjes (-
) of punten (.
) als scheidingstekens gebruikt. Deze tekenreeks moet in de volgende vorm worden weergegeven:
<number separator number separator number [time] [time]>
Wanneer de taal is ingesteld op us_english
, wordt de standaardvolgorde voor de datum mdy
(maand, dag, jaar). U kunt de datumvolgorde wijzigen met behulp van de instructie SET DATEFORMAT.
De instelling voor SET DATEFORMAT
bepaalt hoe datumwaarden worden geïnterpreteerd. Als de volgorde niet overeenkomt met de instelling, worden de waarden niet geïnterpreteerd als datums. Datums buiten de volgorde kunnen verkeerd worden geïnterpreteerd als buiten het bereik of met verkeerde waarden.
12/10/08
kan bijvoorbeeld worden geïnterpreteerd als een van de zes datums, afhankelijk van de instelling DATEFORMAT
. Een vierdelige jaar wordt geïnterpreteerd als het jaar.
Datumnotatie | Bevelen |
---|---|
[0]4/15/[19]96 |
mdy |
[0]4-15-[19]96 |
mdy |
[0]4.15.[19]96 |
mdy |
[0]4/[19]96/15 |
myd |
15/[0]4/[19]96 |
dmy |
15/[19]96/[0]4 |
dym |
[19]96/15/[0]4 |
ydm |
[19]96/[0]4/15 |
ymd |
Tijdnotatie |
---|
14:30 |
14:30[:20:997] |
14:30[:20.9] |
4am |
4 PM |
Alfabetische notatie
U kunt datumgegevens opgeven met een maand die is opgegeven als de volledige maandnaam. Bijvoorbeeld, April
, of de maand afkorting van Apr
, opgegeven in de huidige taal. Komma's zijn optioneel en hoofdlettergebruik wordt genegeerd.
Hier volgen enkele richtlijnen voor het gebruik van alfabetische datumnotaties:
Plaats de datum- en tijdgegevens tussen enkele aanhalingstekens (
'
). GebruikN''
voor andere talen dan Engels.Tekens tussen vierkante haken zijn optioneel.
Als u alleen de laatste twee cijfers van het jaar opgeeft, bevinden waarden die kleiner zijn dan de laatste twee cijfers van de waarde van de tweecijferige cutoff configuratieoptie zich in dezelfde eeuw bevinden als het grensjaar. Waarden die groter zijn dan of gelijk zijn aan de waarde van deze optie zijn in de eeuw die vóór het grensjaar valt. Als
bijvoorbeeld is (standaard), wordt geïnterpreteerd als en wordt geïnterpreteerd als . Gebruik viercijferige jaren om dubbelzinnigheid te voorkomen. Als de dag ontbreekt, wordt de eerste dag van de maand opgegeven.
De
SET DATEFORMAT
sessie-instelling wordt niet toegepast wanneer u de maand opgeeft in alfabetische vorm.
Alfabetisch |
---|
Apr[il] [15][,] 1996 |
Apr[il] 15[,] [19]96 |
Apr[il] 1996 [15] |
[15] Apr[il][,] 1996 |
15 Apr[il][,][19]96 |
15 [19]96 apr[il] |
[15] 1996 apr[il] |
1996 APR[IL] [15] |
1996 [15] APR[IL] |
ISO 8601-indeling
Als u de ISO 8601-indeling wilt gebruiken, moet u elk element in de indeling opgeven, inclusief de T
, de dubbele punten (:
) en de punt (.
) die in de notatie worden weergegeven.
De haakjes geven aan dat de fractie van het tweede onderdeel optioneel is. Het tijdonderdeel wordt opgegeven in de indeling van 24 uur. De T
geeft het begin aan van het tijdgedeelte van de datum/tijd- waarde.
Het voordeel van het gebruik van de ISO 8601-indeling is dat het een internationale norm met ondubbelzinnige specificatie is. Deze indeling wordt ook niet beïnvloed door de instelling SET DATEFORMAT
of SET LANGUAGE.
Voorbeelden:
2004-05-23T14:25:10
2004-05-23T14:25:10.487
ISO 8601 |
---|
yyyy-MM-ddTHH:mm:ss[.mmm] |
yyyyMMdd[ HH:mm:ss[.mmm]] |
Niet-afgeschreven indeling
Deze indeling is vergelijkbaar met de ISO 8601-indeling, behalve dat deze geen datumscheidingstekens bevat.
Niet-parated |
---|
yyyyMMdd HH:mm:ss[.mmm] |
ODBC-indeling
De ODBC-API definieert escapereeksen om datum- en tijdwaarden weer te geven, die ODBC tijdstempelgegevens aanroept. Deze ODBC-tijdstempelindeling wordt ook ondersteund door de OLE DB-taaldefinitie (DBGUID-SQL) die wordt ondersteund door de Microsoft OLE DB-provider voor SQL Server. Toepassingen die gebruikmaken van de ADO-, OLE DB- en ODBC-API's kunnen deze ODBC-tijdstempelindeling gebruiken om datums en tijden weer te geven.
ESCAPE-reeksen ODBC-tijdstempels hebben de volgende indeling: { <literal_type> '<constant_value>' }
:
<literal_type>
geeft het type escape-reeks op. Tijdstempels hebben drie<literal_type>
aanduidingen:-
d
= alleen datum -
t
= alleen tijd -
ts
= tijdstempel (tijd + datum)
-
<constant_value>
is de waarde van de escape-reeks.<constant_value>
moet deze notaties voor elke<literal_type>
volgen:-
d
:yyyy-MM-dd
-
t
:hh:mm:ss[.fff]
-
ts
:yyyy-MM-dd HH:mm:ss[.fff]
-
ODBC |
---|
{ ts '1998-05-02 01:23:56.123' } |
{ d '1990-10-02' } |
{ t '13:33:41' } |
Afronding van de fractionele secondeprecisie van datum/tijd
datum/tijd--waarden worden afgerond op stappen van .000
, .003
of .007
seconden, zoals wordt weergegeven in het volgende voorbeeld.
SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);
Dit is de resultatenset.
Door de gebruiker opgegeven waarde | Door het systeem opgeslagen waarde |
---|---|
01/01/2024 23:59:59.999 |
2024-01-02 00:00:00.000 |
01/01/2024 23:59:59.998 01/01/2024 23:59:59.997 01/01/2024 23:59:59.996 01/01/2024 23:59:59.995 |
2024-01-01 23:59:59.997 |
01/01/2024 23:59:59.994 01/01/2024 23:59:59.993 01/01/2024 23:59:59.992 |
2024-01-01 23:59:59.993 |
01/01/2024 23:59:59.991 01/01/2024 23:59:59.990 |
2024-01-01 23:59:59.990 |
ANSI- en ISO 8601-naleving
datum/tijd- voldoet niet aan ANSI- of ISO 8601-vereisten.
Datum- en tijdgegevens converteren
Wanneer u converteert naar datum- en tijdgegevenstypen, weigert de database-engine alle waarden die niet als datums of tijden kunnen worden herkend. Zie CAST en CONVERTvoor informatie over het gebruik van de functies CAST
en CONVERT
met datum- en tijdgegevens.
Andere datum- en tijdtypen converteren naar het gegevenstype datum/tijd
In deze sectie wordt beschreven wat er gebeurt wanneer andere datum- en tijdgegevenstypen worden geconverteerd naar het datum/tijd- gegevenstype.
Wanneer de conversie afkomstig is van datum, worden het jaar, de maand en de dag gekopieerd. Het tijdonderdeel is ingesteld op 00:00:00.000
. De volgende code toont de resultaten van het converteren van een DATE
waarde naar een DATETIME
waarde.
DECLARE @date DATE = '12-21-16';
DECLARE @datetime DATETIME = @date;
SELECT @datetime AS '@datetime', @date AS '@date';
Dit is de resultatenset.
@datetime @date
------------------------ -----------
2016-12-21 00:00:00.000 2016-12-21
In het vorige voorbeeld wordt een regiospecifieke datumnotatie (MM-DD-YY
) gebruikt.
DECLARE @date DATE = '12-21-16';
Werk het voorbeeld bij zodat deze overeenkomt met de indeling voor uw regio.
U kunt het voorbeeld ook voltooien met de iso 8601-compatibele datumnotatie (yyyy-MM-dd
). Bijvoorbeeld:
DECLARE @date DATE = '2016-12-21';
DECLARE @datetime DATETIME = @date;
SELECT @datetime AS '@datetime', @date AS '@date';
Wanneer de conversie afkomstig is van time(n), wordt het tijdonderdeel gekopieerd en wordt het datumonderdeel ingesteld op 1900-01-01
. Wanneer de breuknauwkeurigheid van de tijd(n) waarde groter is dan drie cijfers, wordt de waarde afgekapt zodat deze past. In het volgende voorbeeld ziet u de resultaten van het converteren van een TIME(4)
waarde naar een DATETIME
-waarde.
DECLARE @time TIME(4) = '12:10:05.1237';
DECLARE @datetime DATETIME = @time;
SELECT @datetime AS '@datetime', @time AS '@time';
Dit is de resultatenset.
@datetime @time
------------------------ --------------
1900-01-01 12:10:05.123 12:10:05.1237
Wanneer de conversie afkomstig is van smalldatetime, worden de uren en minuten gekopieerd. De seconden en fractionele seconden zijn ingesteld op 0
. De volgende code toont de resultaten van het converteren van een SMALLDATETIME
waarde naar een DATETIME
waarde.
DECLARE @smalldatetime SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime DATETIME = @smalldatetime;
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';
Dit is de resultatenset.
@datetime @smalldatetime
------------------------ --------------------
2016-12-01 12:32:00.000 2016-12-01 12:32:00
Wanneer de conversie afkomstig is van datetimeoffset(n), worden de datum- en tijdonderdelen gekopieerd. De tijdzone wordt afgekapt. Wanneer de breuknauwkeurigheid van de datetimeoffset(n) waarde groter is dan drie cijfers, wordt de waarde afgekapt. In het volgende voorbeeld ziet u de resultaten van het converteren van een DATETIMEOFFSET(4)
waarde naar een DATETIME
-waarde.
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime DATETIME = @datetimeoffset;
SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';
Dit is de resultatenset.
@datetime @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +10:0
Wanneer de conversie afkomstig is van datetime2(n), worden de datum en tijd gekopieerd. Wanneer de breuknauwkeurigheid van de datetime2(n) waarde groter is dan drie cijfers, wordt de waarde afgekapt. In het volgende voorbeeld ziet u de resultaten van het converteren van een DATETIME2(4)
waarde naar een DATETIME
-waarde.
DECLARE @datetime2 DATETIME2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime DATETIME = @datetime2;
SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';
Dit is de resultatenset.
@datetime @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
Voorbeelden
In het volgende voorbeeld worden de resultaten van het casten van een tekenreeks vergeleken met elke datum en tijd gegevenstype.
SELECT CAST('2024-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
CAST('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
CAST('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset';
Dit is de resultatenset.
Gegevenstype | Uitvoer |
---|---|
time |
12:35:29.1234567 |
date |
2024-05-08 |
smalldatetime |
2024-05-08 12:35:00 |
datetime |
2024-05-08 12:35:29.123 |
datetime2 |
2024-05-08 12:35:29.1234567 |
datetimeoffset |
2024-05-08 12:35:29.1234567 +12:15 |