V tomto článku prozkoumáme použití různých formátů data SQL CONVERT v rámci SQL Server.
Výklad data se v různých zemích liší. Předpokládejme, že máte globální databázi SQL Server s tabulkou, která obsahuje konkrétní formát data. Například má sloupec data, který má hodnotu 01/05/2020.
jak si to vykládáte? Podívejme se na následující výklady v různých zemích.
- USA:5. ledna 2020 (standardní formát – mm/dd/rrrr)
- Evropa:1. května 2020 (standardní formát – dd/mm/rrrr)
Jiné země navíc používají jiné formáty data:
- Turecko:dd.mm.yyyy
- Indie:dd-mm-yyyy
- Bulharsko:yyyy-m-d
- Maďarsko:yyyy.mm.dd.
Další informace o formátech data podle zemí naleznete na Wikipedii.
Kromě toho někdy chceme zahrnout také časové razítko spolu s daty. Několik příkladů:
- 01.05.2020 10:00
- 05.05.2020 14:00
- 05.05.2020 14:00
- 01/05/2020 02:00:55 AM
Není možné ukládat data do tabulky SQL Serveru v různých formátech, takže potřebujeme způsob, jak formáty data převést. Pojďme prozkoumat různé metody formátu data SQL CONVERT.
Funkce data SQL CONVERT
Databázoví profesionálové obvykle používají funkci SQL CONVERT data k získání dat do určeného a konzistentního formátu. Tím se použijí kódy stylů pro konkrétní data výstupu.
Syntaxe funkce CONVERT():
CONVERT(datový typ, datum a čas [,styl])
V níže uvedeném SQL dotazu převedeme datum a čas do dvou formátů pomocí funkce CONVERT().
- Formát mm/dd/rr:kód stylu 1
- Formát mm/dd/rrrr:kód stylu 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]
Podobně můžeme zadat různé kódy stylů, abyste mohli převést data do požadovaného formátu.
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]
Na níže uvedeném snímku obrazovky můžete vidět kód stylu, jeho standardy, formáty a data výstupu.
Převod dat pomocí funkce FORMAT()
Ve výše uvedené funkci CONVERT() jsme povinni zadat kódy stylů pro výstup určitého formátu. Obvykle si tyto kódy nechceme pamatovat; proto společnost Microsoft zavedla funkci FORMAT() v SQL Server 2012.
Syntaxe je uvedena níže.
FORMAT (hodnota, formát [, kultura])
Hodnota :Vyžaduje hodnotu v podporovaném formátu. Podrobný seznam najdete v dokumentaci společnosti Microsoft.
Formátovat :Ve formátu můžeme specifikovat kódy formátu nebo vzor pro překrytí vstupních dat. Níže uvedený skript ukazuje kódy formátu, vzor a výstupní formát.
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'
Kultura :Je to volitelný argument a definuje kulturu. Pokud neurčíme žádnou kulturu, SQL Server použije jazyk aktuální relace.
V níže uvedeném dotazu převedeme formát data do zadané jazykové verze. Musíme specifikovat kód kultury. Například kulturní kód pro USA je en-US a hi-IN je pro Indii.
Skripty používají d formátový kód pro vzory krátkých dat.
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)';
Získáte formát data v zadané kultuře, jak je uvedeno níže.
Pokud chcete, aby byl výstup data ve formátu celé datum/čas (dlouhý čas), zadejte kód formátu F a ten rychle změní formát data.
Ve formátu data můžete také určit vlastní formáty a převede vstupní řetězec data podle vašich požadavků.
K určení vlastních řetězců můžeme použít následující zkratky.
- dd:Den v měsíci (01 až 31)
- dddd:denní pravopis
- MM:Číslo měsíce (01 až 12)
- MMMM:Pravopis měsíce
- yy:Rok ve dvou číslicích
- yyyy:Čtyřmístný rok
- hh:Je hodina 01 až 12
- HH:Dá to 24 hodin. formát hodiny 00 až 23
- mm:minuta 00 až 59
- ss:sekunda od 00 do 59
- tt:AM nebo PM
V níže uvedeném skriptu jsme převedli vstupní formáty data do několika formátů pomocí výše uvedených zkratek nebo kódů.
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]
Použití AT TIME ZONE v SQL Server 2016 nebo novějším
Různé země se řídí různými časovými pásmy. Obvykle se tato časová pásma řídí odchylkou od času koordinovaného světového času (UTC). Několik příkladů časových pásem:
- Australský centrální letní čas:UTC +10:30
- Indický standardní čas:UTC +5:30
- Horský letní čas:UTC-6
- Singapurský čas:UTC+8
- Střední letní čas:UTC-5
Podrobný seznam časových pásem naleznete v tomto článku.
Mnoho zemí dodržuje letní čas a hodiny se upravují na 1 hodinu (nebo 30-45 minut) v závislosti na časových pásmech. Například centrální letní čas se řídil níže uvedeným plánem:
- Začátek standardního času:1. listopadu 2020 02:00 místního času. Hodiny byly otočeny o jednu hodinu zpět.
- Standardní čas končí 14. března 2021 ve 2:00 místního času. Hodiny se posunou o hodinu dopředu.
SQL Server si není vědom těchto časových pásem a letního času. Organizace se obvykle řídí zónami UTC, protože nevyžaduje žádné změny.
Jak můžeme převést časová pásma na SQL Server?
Můžete použít AT TIME ZONE počínaje SQL Server 2016 a převést časová pásma. V níže uvedeném dotazu zobrazuje data pro centrální standardní čas, indický standardní čas a samojský standardní čas.
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'
Chcete-li zjistit podporovaná časová pásma, můžete se zeptat na sys.time_zone_info a vrátí časové pásmo a posun.
Poté můžete filtrovat časová pásma, která aktuálně platí podle letního času.
Select * from sys.time_zone_info where is_currently_dst=1
Nyní se podívejme na letní čas pro východní čas.
- Letní čas začal – neděle 8. března 2020 ve 2:00.
- Letní čas skončil – neděle 1. listopadu 2020 ve 2:00.
Převeďte zónu UTC na východní standardní čas a můžete si povšimnout dopadu letního času.
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];
Užitečné body pro použití formátů data SQL CONVERT
Vyhodnoťte požadavky své aplikace a vyberte vhodný datový typ datum, SmallDateTime, DateTime, DateTime2 a DateTimeOffset.
Formát data můžete převést pomocí funkcí SQL CONVERT data a FORMAT; je však vhodné použít formát, který nejlépe vyhovuje vaší pracovní zátěži. To vám pomůže vyhnout se nutnosti používat explicitní převod data.
Letní čas můžete na SQL Server zaúčtovat pomocí funkce AT TIME ZONE počínaje SQL