В тази статия ще разгледаме използването на различните формати за дата на SQL CONVERT в SQL Server.
Тълкуването на датата варира в различните страни. Да предположим, че имате глобална база данни на SQL Server с таблица, която съдържа конкретен формат за дата. Например има колона за дата със стойността 01/05/2020.
Как го тълкувате? Нека разгледаме следните тълкувания в различните държави.
- САЩ:5 януари 2020 г. (стандартен формат – мм/дд/гггг)
- Европа:1 май 2020 г. (стандартен формат – дд/мм/гггг)
Освен това други държави следват различни формати за дати:
- Турция:дд.мм.гггг
- Индия:дд-мм-гггг
- България:yyyy-m-d
- Унгария:гггг.мм.дд.
Можете да се обърнете към Уикипедия за повече информация относно форматите на датите по държави.
Освен това, понякога искаме да включим и времевата марка заедно с датите. Няколко примера за това са:
- 01.05.2020 г. 10:00 ч.
- 05.05.2020 г. 14:00 ч.
- 05.05.2020 г. 14:00 ч.
- 01.05.2020 г. 02:00:55 ч.
Не е възможно да се съхраняват дати в таблица на SQL Server в различни формати, така че се нуждаем от начин за конвертиране на формати за дати. Нека разгледаме различните методи за форматиране на датата в SQL CONVERT.
Функция SQL CONVERT дата
Обикновено специалистите по база данни използват функцията SQL CONVERT date, за да получат датите в определен и последователен формат. Това прилага стиловите кодове за конкретни изходни дати.
Синтаксис на функцията CONVERT():
CONVERT(тип данни, дата и час [,стил])
В долната SQL заявка преобразуваме датата и часа в два формата с помощта на функцията CONVERT().
- mm/dd/yy формат:код на стил 1
- мм/дд/гггг формат:код на стил 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]
По подобен начин можем да посочим различни стилови кодове, за да можете да конвертирате датите в необходимия формат.
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]
На екранната снимка по-долу можете да видите кода на стила, техните стандарти, формати и изходни дати.
Преобразуване на дати с помощта на функцията FORMAT()
В горната функция CONVERT() от нас се изисква да посочим стилови кодове за конкретен изходен формат. Обикновено не искаме да помним тези кодове; следователно Microsoft въведе функцията FORMAT() в SQL Server 2012.
Синтаксисът е показан по-долу.
ФОРМАТ (стойност, формат [, култура])
Стойност :Изисква стойност в поддържания формат. Можете да се обърнете към документацията на Microsoft за подробен списък.
Формат :Във формата можем да посочим кодовете на формата или шаблона, за да прикрием данните за входна дата. Скриптът по-долу показва кодовете на формата, шаблона и изходния формат.
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'
Култура :Това е незадължителен аргумент и определя културата. Ако не посочим култура, SQL Server използва езика на текущата сесия.
В заявката по-долу ще преобразуваме формат на дата в определена култура. Трябва да посочим културния код. Например кодът на културата за САЩ е en-US, а hi-IN е за Индия.
Скриптовете използват d код за формат за модели на кратки дати.
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)';
Получавате формата на датата в определена култура, както е показано по-долу.
Ако искате датата да се изведе в пълен образец за дата/час (дълго време), посочете кода на формата F и той бързо ще промени формата на датата ви.
Във формата на датата можете също да посочите персонализираните формати и той преобразува въведения низ за дата според вашите изисквания.
За да посочим персонализираните низове, можем да използваме следните съкращения.
- дд:Ден от месеца (01 до 31)
- dddd:дневен правопис
- MM:Номер на месеца (01 до 12)
- MMMM:Месечен правопис
- yy:година в двуцифрено число
- гггг:четирицифрена година
- hh:Часът е от 01 до 12
- HH:Дава 24 часа. формат час от 00 до 23
- mm:минута от 00 до 59
- ss:секунда от 00 до 59
- tt:AM или PM
В скрипта по-долу преобразувахме форматите за входна дата в множество формати, използвайки горните съкращения или кодове.
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]
Използване на AT TIME ZONE в SQL Server 2016 или по-нова версия
Различните държави следват различни часови зони. Обикновено тези часови зони следват изместването от времето на универсалното координирано време (UTC). Няколко примера за часови зони са:
- Централно лятно време в Австралия:UTC +10:30
- Стандартно време в Индия:UTC +5:30
- Планинско лятно време:UTC-6
- Сингапурско време:UTC+8
- Централно лятно време:UTC-5
Можете да се обърнете към тази статия за подробен списък с часови зони.
Много страни следват лятното часово време и часовникът се настройва на 1 час (или 30-45 минути) в зависимост от часовите зони. Например централното лятно време следваше графика по-долу:
- Стандартното време започна:1 ноември 2020 г. 02:00 местно време. Часовниците бяха върнати един час назад.
- Стандартното време приключва на 14 март 2021 г. в 02:00 ч. местно време. Часовниците ще се преместят с един час напред.
SQL Server не е наясно с тези часови зони и лятното часово време. Обикновено организацията следва UTC зоните, тъй като не изисква никакви промени.
Как можем да преобразуваме часовите зони в SQL Server?
Можете да използвате AT TIME ZONE, започвайки от SQL Server 2016 и да конвертирате часовите зони. В заявката по-долу тя показва дати за централно стандартно време, индийско стандартно време и стандартно време в Самоа.
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'
За да знаете поддържаните часови зони, можете да запитате sys.time_zone_info и връща часовата зона и отместването.
След това можете да филтрирате часовите зони, които в момента спазват лятното часово време.
Select * from sys.time_zone_info where is_currently_dst=1
Сега нека разгледаме лятното часово време за източно време.
- Започна лятното часово време – неделя, 8 март 2020 г. в 2:00 часа сутринта.
- Лятното часово време приключи – неделя, 1 ноември 2020 г., в 2:00 ч.
Преобразувайте вашата UTC зона в източното стандартно време и можете да забележите въздействието на лятното часово време.
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];
Полезни точки за използване на SQL CONVERT формати за дата
Оценете изискванията на вашето приложение и изберете подходящия тип данни дата, SmallDateTime, DateTime, DateTime2 и DateTimeOffset.
Можете да конвертирате формата на датата, като използвате функциите SQL CONVERT date и FORMAT; все пак е препоръчително да използвате формата, който най-добре отговаря на вашите работни натоварвания. Това ще ви помогне да избегнете необходимостта да използвате изричното преобразуване на дата.
Можете да отчетете лятното часово време в SQL Server, като използвате функцията AT TIME ZONE, започвайки от SQL