Dela via


datetime (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-databas i Microsoft Fabric

Definierar ett datum som kombineras med en tid på dagen med bråksekunder som baseras på en 24-timmarsklocka.

Undvik att använda datetime- för nytt arbete. Använd i stället tid, datum, datetime2och datetimeoffset datatyper. Dessa typer överensstämmer med SQL Standard och är mer portabla. tid, datetime2 och datetimeoffset ge mer precision i sekunder. datetimeoffset ger tidszonsstöd för globalt distribuerade program.

Beskrivning

Egenskap Värde
Syntax DATETIME
Användning DECLARE @MyDatetime DATETIME;
CREATE TABLE Table1 (Column1 DATETIME);
Standardsträngliterala format (används för klient på nednivå) Ej tillämpligt
datumintervall 1753-01-01 (1 januari 1753) till och med 9999-12-31 (31 december 9999)
tidsintervall 00:00:00 till 23:59:59.997
Tidszonsförskjutningsintervall Ingen
elementintervall yyyy är fyra siffror från 1753 till 9999 som representerar ett år.

MM är två siffror, från 01 till 12, som representerar en månad under det angivna året.

dd är två siffror, allt från 01 till 31 beroende på månad, som representerar en dag i den angivna månaden.

HH är två siffror, från 00 till 23, som representerar timmen.

mm är två siffror, från 00 till 59, som representerar minuten.

ss är två siffror, från 00 till 59, som representerar den andra.

n* är noll till tre siffror, från 0 till 999, som representerar bråksekunderna.
Teckenlängd Minst 19 positioner till högst 23
Lagringsstorlek 8 byte
noggrannhet Avrundad till steg om .000, .003eller .007 sekunder
standardvärde 1900-01-01 00:00:00
kalender Gregorianskt (inkluderar det kompletta antalet år)
Användardefinierad bråkdels sekundprecision Nej
Tidszonsförskjutningsmedveten och bevarande Nej
sommartidsmedveten Nej

Strängliterala format som stöds för datetime

I följande tabeller visas de strängliterala format som stöds för datetime-. Förutom ODBC är datetime strängliteraler inom enkla citattecken ('), till exempel 'string_literaL'. Om miljön inte är us_englishska strängliteralerna vara i Unicode-format N'string_literaL'.

Numeriskt format

Du kan ange datumdata med en angiven numerisk månad. Till exempel representerar 5/20/97 den tjugonde dagen i maj 1997. När du använder numeriskt datumformat anger du månad, dag och år i en sträng som använder snedstreck (/), bindestreck (-) eller punkter (.) som avgränsare. Den här strängen måste visas i följande formulär:

<number separator number separator number [time] [time]>

När språket är inställt på us_englishär standardordningen för datumet mdy (månad, dag, år). Du kan ändra datumordningen med hjälp av SET DATEFORMAT-instruktionen.

Inställningen för SET DATEFORMAT avgör hur datumvärden tolkas. Om ordningen inte matchar inställningen tolkas inte värdena som datum. Out-of-order-datum kan misstolkas som out-of-range eller med fel värden. Till exempel kan 12/10/08 tolkas som ett av sex datum, beroende på inställningen DATEFORMAT. Ett år i fyra delar tolkas som året.

Datumformat Ordning
[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
Tidsformat
14:30
14:30[:20:997]
14:30[:20.9]
4am
4 PM

Alfabetiskt format

Du kan ange datumdata med en månad som anges som det fullständiga månadsnamnet. Till exempel April, eller månadsförkortningen för Apr, som anges på det aktuella språket. Kommatecken är valfria och versaler ignoreras.

Här följer några riktlinjer för att använda alfabetiska datumformat:

  • Omsluta datum- och tidsdata inom enkla citattecken ('). För andra språk än engelska använder du N''.

  • Tecken som omges av hakparenteser är valfria.

  • Om du bara anger de två sista siffrorna för året är värdena mindre än de två sista siffrorna i värdet för tvåsiffrig årsgräns konfigurationsalternativet är i samma århundrade som brytåret. Värden som är större än eller lika med värdet för det här alternativet är i det århundrade som kommer före brytåret. Om är 2050 (standard) tolkas till exempel 25 som 2025 och 50 tolkas som 1950. Använd fyrsiffriga år för att undvika tvetydighet.

  • Om dagen saknas anges den första dagen i månaden.

  • Inställningen SET DATEFORMAT session tillämpas inte när du anger månaden i alfabetisk form.

Alfabetisk
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-format

Om du vill använda FORMATET ISO 8601 måste du ange varje element i formatet, inklusive T, kolon (:) och perioden (.) som visas i formatet.

Hakparenteserna anger att bråkdelen av den andra komponenten är valfri. Tidskomponenten anges i 24-timmarsformat. T anger början av tidsdelen av datetime- värde.

Fördelen med att använda FORMATET ISO 8601 är att det är en internationell standard med entydig specifikation. Det här formatet påverkas inte heller av inställningen SET DATEFORMAT eller SET LANGUAGE.

Exempel:

  • 2004-05-23T14:25:10
  • 2004-05-23T14:25:10.487
ISO 8601
yyyy-MM-ddTHH:mm:ss[.mmm]
yyyyMMdd[ HH:mm:ss[.mmm]]

Format som inte är skilt

Det här formatet liknar FORMATET ISO 8601, förutom att det inte innehåller några datumavgränsare.

Ej skild
yyyyMMdd HH:mm:ss[.mmm]

ODBC-format

ODBC-API:et definierar escape-sekvenser för att representera datum- och tidsvärden, som ODBC anropar tidsstämpeldata. Det här ODBC-tidsstämpelformatet stöds också av ole db-språkdefinitionen (DBGUID-SQL) som stöds av Microsoft OLE DB-providern för SQL Server. Program som använder ADO-, OLE DB- och ODBC-baserade API:er kan använda det här ODBC-tidsstämpelformatet för att representera datum och tider.

ODBC-tidsstämpelns escape-sekvenser är av formatet: { <literal_type> '<constant_value>' }:

  • <literal_type> anger typen av escape-sekvens. Tidsstämplar har tre <literal_type>-specificerare:

    • d = endast datum
    • t = endast tid
    • ts = tidsstämpel (tid + datum)
  • <constant_value> är värdet för escape-sekvensen. <constant_value> måste följa dessa format för varje <literal_type>:

    • 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' }

Avrundning av datetime fractional second precision

datetime- värden avrundas till steg om .000, .003eller .007 sekunder, enligt följande exempel.

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);

Här är resultatuppsättningen.

Användarangivet värde System lagrat värde
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- och ISO 8601-efterlevnad

datetime inte är ANSI- eller ISO 8601-kompatibel.

Konvertera datum- och tidsdata

När du konverterar till datatyper för datum och tid avvisar databasmotorn alla värden som den inte kan identifiera som datum eller tider. Information om hur du använder funktionerna CAST och CONVERT med datum- och tidsdata finns i CAST- och CONVERT-.

Konvertera andra datum- och tidstyper till datatypen datetime

I det här avsnittet beskrivs vad som händer när andra datatyper för datum och tid konverteras till datetime datatyp.

När konverteringen kommer från datumkopieras året, månaden och dagen. Tidskomponenten är inställd på 00:00:00.000. Följande kod visar resultatet av konvertering av ett DATE-värde till ett DATETIME värde.

DECLARE @date DATE = '12-21-16';
DECLARE @datetime DATETIME = @date;

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

Här är resultatuppsättningen.

@datetime                @date
------------------------ -----------
2016-12-21 00:00:00.000  2016-12-21

I föregående exempel används ett regionspecifikt datumformat (MM-DD-YY).

DECLARE @date DATE = '12-21-16';

Du bör uppdatera exemplet så att det matchar formatet för din region.

Du kan också slutföra exemplet med iso 8601-kompatibelt datumformat (yyyy-MM-dd). Till exempel:

DECLARE @date DATE = '2016-12-21';
DECLARE @datetime DATETIME = @date;

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

När konverteringen kommer från tid(n)kopieras tidskomponenten och datumkomponenten anges till 1900-01-01. När bråkprecisionen för tid(n) värdet är större än tre siffror trunkeras värdet så att det passar. I följande exempel visas resultatet av konverteringen av ett TIME(4)-värde till ett DATETIME värde.

DECLARE @time TIME(4) = '12:10:05.1237';
DECLARE @datetime DATETIME = @time;

SELECT @datetime AS '@datetime', @time AS '@time';

Här är resultatuppsättningen.

@datetime                @time
------------------------ --------------
1900-01-01 12:10:05.123  12:10:05.1237

När konverteringen kommer från smalldatetimekopieras timmar och minuter. Sekunderna och bråksekunderna är inställda på 0. Följande kod visar resultatet av konvertering av ett SMALLDATETIME-värde till ett DATETIME värde.

DECLARE @smalldatetime SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime DATETIME = @smalldatetime;

SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';

Här är resultatuppsättningen.

@datetime                @smalldatetime
------------------------ --------------------
2016-12-01 12:32:00.000  2016-12-01 12:32:00

När konverteringen kommer från datetimeoffset(n)kopieras datum- och tidskomponenterna. Tidszonen trunkeras. När bråkprecisionen för datetimeoffset(n) värdet är större än tre siffror trunkeras värdet. I följande exempel visas resultatet av konverteringen av ett DATETIMEOFFSET(4)-värde till ett DATETIME värde.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime DATETIME = @datetimeoffset;

SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';

Här är resultatuppsättningen.

@datetime                @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237 +10:0

När konverteringen kommer från datetime2(n)kopieras datum och tid. När bråkprecisionen för datetime2(n) värdet är större än tre siffror trunkeras värdet. I följande exempel visas resultatet av konverteringen av ett DATETIME2(4)-värde till ett DATETIME värde.

DECLARE @datetime2 DATETIME2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime DATETIME = @datetime2;

SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';

Här är resultatuppsättningen.

@datetime                @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237

Exempel

I följande exempel jämförs resultatet av gjutning av en sträng med varje datum och tid datatyp.

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';

Här är resultatuppsättningen.

Datatyp Utdata
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