Delen via


datetime (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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, .003of .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 ('). Gebruik N''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, .003of .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