Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Различни начини за използване на функцията SQL CONVERT date

В тази статия ще разгледаме използването на различните формати за дата на 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 начина за изброяване на всички изгледи в база данни на SQL Server

  2. Вземете основните колони на изглед въз основа на неговия набор от резултати

  3. datetime срещу datetimeoffset в SQL Server:Каква е разликата?

  4. Как да промените схемата на обект (таблица, изглед, съхранена процедура) в база данни на SQL Server - SQL Server / TSQL урок, част 28

  5. Агрегация на низове през годините в SQL Server