I den här artikeln kommer vi att utforska användningen av de olika SQL CONVERT-datumformaten inom SQL Server.
Datumtolkningen varierar mellan olika länder. Anta att du har en global SQL Server-databas med en tabell som innehåller ett specifikt datumformat. Till exempel har den en datumkolumn som har värdet 01/05/2020.
Hur tolkar du det? Låt oss titta på följande tolkningar i olika länder.
- USA:5 januari 2020 (Standardformat – mm/dd/åååå)
- Europa:1 maj 2020 (Standardformat – dd/mm/åååå)
Dessutom följer andra länder olika datumformat:
- Turkiet:dd.mm.åååå
- Indien:dd-mm-åååå
- Bulgarien:åååå-m-d
- Ungern:åååå.mm.dd.
Du kan gå till Wikipedia för mer information om datumformat per land.
Utöver detta vill vi ibland också ta med tidsstämpeln tillsammans med datum. Några exempel på detta är:
- 01/05/2020 10:00
- 0/05/2020 14:00
- 05/00 2020 14:00
- 01/05/2020 02:00:55 AM
Det är inte möjligt att lagra datum i en SQL Server-tabell i olika format, så vi behöver ett sätt att konvertera datumformat. Låt oss utforska de olika SQL CONVERT-datumformatmetoderna.
SQL CONVERT datumfunktion
Vanligtvis använder databasproffs funktionen SQL CONVERT date för att få datum till ett specificerat och konsekvent format. Detta tillämpar stilkoderna för specifika utdatadatum.
Syntax för CONVERT()-funktionen:
KONVERTERA(datatyp, datumtid [,stil])
I SQL-frågan nedan konverterar vi datetime till två format med hjälp av CONVERT()-funktionen.
- mm/dd/åå-format:stilkod 1
- mm/dd/åååå format:stilkod 101
DECLARE @Inputdate datetime = '2019-12-31 14:43:35.863'; Select CONVERT(varchar,@Inputdate,1) as [mm/dd/yy], CONVERT(varchar,@Inputdate,101) as [mm/dd/yyyy]
På samma sätt kan vi specificera olika stilkoder så att du kan konvertera datum till önskat format.
SELECT '0' AS [StyleCode], 'Default format' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 0) AS [OutputFormat] UNION ALL SELECT '1' AS [StyleCode], 'USA - mm/dd/yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 1) AS [OutputFormat] UNION ALL SELECT '2' AS [StyleCode], 'ANSI - dd.mm.yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 2) AS [OutputFormat] UNION ALL SELECT '3' AS [StyleCode], 'British and French - dd/mm/yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 3) AS [OutputFormat] UNION ALL SELECT '4' AS [StyleCode], 'German - dd.mm.yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 4) AS [OutputFormat] UNION ALL SELECT '5' AS [StyleCode], 'Italian - dd-mm-yy ' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 5) AS [OutputFormat] UNION ALL SELECT '6' AS [StyleCode], 'Shortened month name -dd mon yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 6) AS [OutputFormat] UNION ALL SELECT '7' AS [StyleCode], 'Shortened month name - mon dd, yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 7) AS [OutputFormat] UNION ALL SELECT '8' AS [StyleCode], '24 hour time -hh:mm:ss' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 8) AS [OutputFormat] UNION ALL SELECT '9' AS [StyleCode], 'Default + milliseconds - mon dd yyyy hh:mm:ss:mmmAM (or PM)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 9) AS [OutputFormat] UNION ALL SELECT '10' AS [StyleCode], 'USA - mm-dd-yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 10) AS [OutputFormat] UNION ALL SELECT '11' AS [StyleCode], 'Japan -yy/mm/dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 11) AS [OutputFormat] UNION ALL SELECT '12' AS [StyleCode], 'ISO format -yymmdd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 12) AS [OutputFormat] UNION ALL SELECT '13' AS [StyleCode], 'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 13) AS [OutputFormat] UNION ALL SELECT '14' AS [StyleCode], ' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 14) AS [OutputFormat] UNION ALL SELECT '20' AS [StyleCode], 'ODBC canonical -yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 20) AS [OutputFormat] UNION ALL SELECT '21' AS [StyleCode], 'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 21) AS [OutputFormat] UNION ALL SELECT '22' AS [StyleCode], 'mm/dd/yy hh:mm:ss AM (or PM)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 22) AS [OutputFormat] UNION ALL SELECT '23' AS [StyleCode], 'ISO 8601 - yyyy-mm-dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 23) AS [OutputFormat] UNION ALL SELECT '100' AS [StyleCode], 'mon dd yyyy hh:mmAM' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 100) AS [OutputFormat] UNION ALL SELECT '101' AS [StyleCode], 'USA -mm/dd/yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 101) AS [OutputFormat] UNION ALL SELECT '102' AS [StyleCode], 'ANSI -yyyy.mm.dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 102) AS [OutputFormat] UNION ALL SELECT '103' AS [StyleCode], 'British/French -dd/mm/yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 103) AS [OutputFormat] UNION ALL SELECT '104' AS [StyleCode], 'German - dd.mm.yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 104) AS [OutputFormat] UNION ALL SELECT '105' AS [StyleCode], 'Italian -dd-mm-yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 105) AS [OutputFormat] UNION ALL SELECT '106' AS [StyleCode], 'Shortened month name -dd mon yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 106) AS [OutputFormat] UNION ALL SELECT '107' AS [StyleCode], 'Shortened month name -mon dd, yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 107) AS [OutputFormat] UNION ALL SELECT '108' AS [StyleCode], '24 hour time -hh:mm:ss' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 108) AS [OutputFormat] UNION ALL SELECT '109' AS [StyleCode], 'Default + milliseconds -mon dd yyyy hh:mm:ss:mmmAM (or PM) ' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 109) AS [OutputFormat] UNION ALL SELECT '110' AS [StyleCode], 'USA -mm-dd-yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 110) AS [OutputFormat] UNION ALL SELECT '111' AS [StyleCode], 'JAPAN -yyyy/mm/dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 111) AS [OutputFormat] UNION ALL SELECT '112' AS [StyleCode], 'ISO -yyyymmdd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 112) AS [OutputFormat] UNION ALL SELECT '113' AS [StyleCode], 'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 113) AS [OutputFormat] UNION ALL SELECT '114' AS [StyleCode], ' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 114) AS [OutputFormat] UNION ALL SELECT '120' AS [StyleCode], 'ODBC canonical- yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 120) AS [OutputFormat] UNION ALL SELECT '121' AS [StyleCode], 'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 121) AS [OutputFormat] UNION ALL SELECT '126' AS [StyleCode], 'ISO8601 -yyyy-mm-ddThh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 126) AS [OutputFormat] UNION ALL SELECT '127' AS [StyleCode], 'ISO8601 with time zone Z-yyyy-mm-ddThh:mm:ss.mmmZ' AS [Standard and Format], CONVERT(VARCHAR(100), Getdate(), 127) AS [OutputFormat] UNION ALL SELECT '131' AS [StyleCode], 'Arabic Hijri date - Islamic calendar' AS [Standard and Format], CONVERT(VARCHAR(100), Getdate(), 131) AS [OutputFormat]
I skärmdumpen nedan kan du se stilkoden, deras standarder, format och utdatadatum.
Konvertera datum med FORMAT()-funktionen
I funktionen CONVERT() ovan måste vi ange stilkoder för ett specifikt formatutdata. Vanligtvis vill vi inte behöva komma ihåg dessa koder; därför introducerade Microsoft funktionen FORMAT() i SQL Server 2012.
Syntaxen visas nedan.
FORMAT (värde, format [, kultur])
Värde :Det kräver ett värde i det format som stöds. Du kan se Microsoft-dokumentationen för en detaljerad lista.
Format :I formatet kan vi specificera formatkoderna eller mönstret för att dölja indatadata. Skriptet nedan visar formatkoderna, mönstret och utdataformatet.
DECLARE @InputDate DATETIME = '2020-12-08 15:58:17.643' SELECT 'd' AS [FormatCode], 'Short Date Pattern' AS 'Pattern', Format(@InputDate, 'd') AS 'Output' UNION ALL SELECT 'D' AS [FormatCode], 'Long Date Pattern' AS 'Pattern', Format(@InputDate, 'D') AS 'Output' UNION ALL SELECT 'f' AS [FormatCode], 'Full Date/Time pattern (Short Time)' AS 'Pattern', Format(@InputDate, 'f') AS 'Output' UNION ALL SELECT 'F' AS [FormatCode], 'Full Date/Time pattern (Long Time)' AS 'Pattern', Format(@InputDate, 'F') UNION ALL SELECT 'g' AS [FormatCode], 'General Date/Time pattern (Short Time)' AS 'Pattern', Format(@InputDate, 'g') UNION ALL SELECT 'G' AS [FormatCode], 'General Date/Time pattern (Long Time)' AS 'Pattern', Format(@InputDate, 'G') AS 'Output' UNION ALL SELECT 'm' AS [FormatCode], 'Month/Day pattern' AS 'Pattern', Format(@InputDate, 'm') AS 'Output' UNION ALL SELECT 'O' AS [FormatCode], 'Round trip Date/Time pattern' AS 'Pattern', Format(@InputDate, 'O') AS 'Output' UNION ALL SELECT 'R' AS [FormatCode], 'RFC1123 pattern' AS 'Pattern', Format(@InputDate, 'R') AS 'Output' UNION ALL SELECT 's' AS [FormatCode], 'Sortable Date/Time pattern' AS 'Pattern', Format(@InputDate, 's') AS 'Output' UNION ALL SELECT 't' AS [FormatCode], 'Short Time pattern' AS 'Pattern', Format(@InputDate, 't') AS 'Output' UNION ALL SELECT 'T' AS [FormatCode], 'Long Time Pattern' AS 'Pattern', Format(@InputDate, 'T') AS 'Output' UNION ALL SELECT 'u' AS [FormatCode], 'Universal sortable Date/Time pattern' AS 'Pattern', Format(@InputDate, 'u') AS 'Output' UNION ALL SELECT 'U' AS [FormatCode], 'Universal Full Date/Time pattern' AS 'Pattern', Format(@InputDate, 'U') AS 'Output' UNION ALL SELECT 'Y' AS [FormatCode], 'Year Month pattern' AS 'Pattern', Format(@InputDate, 'Y') AS 'Output'
Kultur :Det är ett valfritt argument och definierar kulturen. Om vi inte anger någon kultur, använder SQL Server språket för den aktuella sessionen.
I frågan nedan kommer vi att konvertera ett datumformat till en specificerad kultur. Vi måste specificera kulturkoden. Till exempel är kulturkoden för USA en-US och hi-IN är för Indien.
Skripten använder d formatkod för korta datummönster.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760'; SELECT FORMAT (@d, 'd', 'en-US') AS 'US English', FORMAT (@d, 'd', 'no') AS 'Norwegian Result', FORMAT(@d, 'd', 'hi-IN') AS 'India', FORMAT(@d, 'd', 'ru-RU') AS 'Russian', FORMAT(@d, 'd', 'gl-ES') AS 'Galician (Spain)', FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English', FORMAT (@d, 'd', 'zu') AS 'Zulu', FORMAT ( @d, 'd', 'de-de' ) AS 'German', FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC)';
Du får datumformatet i en specificerad kultur, som visas nedan.
Om du vill ha datumutmatningen i fullständigt datum/tid (lång tid) mönster, ange formatkoden F, så ändrar den snabbt ditt datumformat.
I datumformatet kan du också ange de anpassade formaten och den konverterar den inmatade datumsträngen enligt dina krav.
För att specificera de anpassade strängarna kan vi använda följande förkortningar.
- dd:Dag i månaden (01 till 31)
- dddd:dagstavning
- MM:Månadsnummer (01 till 12)
- MMMM:Månadsstavning
- åå:år med två siffror
- åååå:Fyrsiffrigt år
- hh:Det är klockan 01 till 12
- HH:Det ger 24 timmar. format timme 00 till 23
- mm:minut 00 till 59
- ss:sekund från 00 till 59
- tt:AM eller PM
I skriptet nedan konverterade vi indataformaten till flera format med hjälp av ovanstående förkortningar eller koder.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760'; SELECT FORMAT (@d,'dd/MM/yyyy ') as [Date Format 1] , FORMAT (@d, 'dd/MM/yyyy, hh:mm:ss ') as [Date Format 2] , FORMAT(@d,'yyyy-MM-dd HH:mm:ss')as [Date Format 3] , FORMAT(@d,'Dd MMM yyyy HH:mm:ss')as [Date Format 4] , FORMAT(@d,'MMM d yyyy h:mm:ss')as [Date Format 5] , FORMAT (@d, 'dddd, MMMM, yyyy')as [Date Format 6] , FORMAT (@d, 'MMM dd yyyy') as [Date Format 7] , FORMAT (@d, 'MM.dd.yy') as [Date Format 8] , FORMAT (@d, 'MM-dd-yy') as [Date Format 9] , FORMAT (@d, 'hh:mm:ss tt')as [Date Format 10] , FORMAT (@d, 'd-M-yy')as [Date Format 11] , FORMAT(@d,'MMMM dd,yyyy')as [Date Format 12]
Använder AT TIME ZONE i SQL Server 2016 eller senare
Olika länder följer olika tidszoner. Vanligtvis följer dessa tidszoner offset från UTC-tid (Coordinated Universal Time). Några exempel på tidszoner är:
- Australian Central Daylight Time:UTC +10:30
- Indien standardtid:UTC +5:30
- Mountain Daylight Time:UTC-6
- Singapore-tid:UTC+8
- Central Daylight Time:UTC-5
Du kan se den här artikeln för en detaljerad lista över tidszoner.
Många länder följer sommartid och klockan justeras 1 timme (eller 30-45 minuter) beroende på tidszoner. Till exempel följde Central Daylight Time schemat nedan:
- Standardtiden började:1 november 2020 02:00 lokal tid. Klockorna vreds tillbaka en timme.
- Standardtid slutar 14 mars 2021 kl. 02.00 lokal tid. Klockorna går framåt en timme.
SQL Server är inte medveten om dessa tidszoner och sommartid. Vanligtvis följer en organisation UTC-zonerna eftersom den inte kräver några ändringar.
Hur kan vi konvertera tidszoner i SQL Server?
Du kan använda AT TIME ZONE från och med SQL Server 2016 och konvertera tidszonerna. I frågan nedan visar den datum för Central Standard Time, India Standard Time och Samoa Standard Time.
Declare @DateinUTC datetime2='2020-11-01 02:00:00' select @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time' as 'Central Standard Time' , @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time' as 'India Standard Time', @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Samoa Standard Time' as 'Samoa Standard Time', @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Dateline Standard Time' as 'Dateline Standard Time'
Om du vill veta vilka tidszoner som stöds kan du fråga sys.time_zone_info och det returnerar tidszonen och offset.
Du kan sedan filtrera de tidszoner som för närvarande följer sommartid.
Select * from sys.time_zone_info where is_currently_dst=1
Låt oss nu överväga sommartid för Eastern Time.
- Sommartid började – söndagen den 8 mars 2020 kl. 02.00.
- Sommartid upphörde – söndagen den 1 november 2020, kl. 02.00.
Omvandla din UTC-zon till Eastern Standard Time, så kan du notera effekten av sommartid.
DECLARE @PreDST datetime = '2020-03-08 06:59:00', @PostDST datetime = '2020-03-08 07:00:00'; SELECT @PreDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST], @PostDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST];
Användbara punkter för att använda SQL CONVERT-datumformat
Utvärdera dina applikationskrav och välj lämplig datatyp datum, SmallDateTime, DateTime, DateTime2 och DateTimeOffset.
Du kan konvertera datumformatet med funktionerna SQL CONVERT date och FORMAT; Det är dock tillrådligt att använda det format som bäst motsvarar dina arbetsbelastningar. Detta hjälper dig att undvika att använda den explicita datumkonverteringen.
Du kan ta hänsyn till sommartid i SQL Server med funktionen AT TIME ZONE från SQL