sql >> Databasteknik >  >> RDS >> Sqlserver

Olika sätt att använda SQL CONVERT date-funktionen

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


  1. Välja en processor för SQL Server 2012

  2. mysqldump Bästa metoder:Del 2 – Migrationsguide

  3. SQLite Subquery

  4. EXPORTERA SOM INFOGA UTTALANDE:Men i SQL Plus åsidosätter raden 2500 tecken!