Мне дана спецификация, которая требует формата даты ISO 8601
, знает ли кто-нибудь коды конверсии или способ получения этих двух примеров:
ISO 8601 Extended Date 2000-01-14T13:42Z
ISO 8601 Basic Date 20090123T105321Z
Мне дана спецификация, которая требует формата даты ISO 8601
, знает ли кто-нибудь коды конверсии или способ получения этих двух примеров:
ISO 8601 Extended Date 2000-01-14T13:42Z
ISO 8601 Basic Date 20090123T105321Z
При работе с датами в SQL Server формат ISO-8601, вероятно, является лучшим способом, поскольку он работает независимо от настроек языка и культуры.
Для ввода данных INSERT в таблицу SQL Server вам не нужны коды конверсии или что-либо еще - просто укажите даты как литеральные строки
INSERT INTO MyTable(DateColumn) VALUES('20090430 12:34:56.790')
и все готово.
Если вам нужно преобразовать столбец даты в формат ISO-8601 в SELECT, вы можете использовать код преобразования 126 или 127 (с информацией о часовом поясе) для достижения формата ISO.
SELECT CONVERT(VARCHAR(33), DateColumn, 126) FROM MyTable
должен предоставить вам:
2009-04-30T12:34:56.790
Это
SELECT CONVERT(NVARCHAR(30), GETDATE(), 126)
произведет это
2009-05-01T14:18:12.430
И более подробную информацию об этом можно найти на MSDN.
Если вам просто нужно вывести дату в формате ISO8601, включая конечный Z, и вы находитесь как минимум на SQL Server 2012, вы можете использовать FORMAT
:
SELECT FORMAT(GetUtcDate(),'yyyy-MM-ddTHH:mm:ssZ')
Это даст вам что-то вроде:
2016-02-18T21:34:14Z
Гоша, НЕТ!!! Вы запрашиваете мир ранений, если вы сохраняете отформатированные даты в SQL Server. Всегда сохраняйте свои даты и время и один из типов данных даты и времени SQL Server (DATETIME, DATE, TIME, DATETIME2, что угодно). Пусть код переднего конца разрешает метод отображения и сохраняет только даты форматирования, когда вы создаете промежуточную таблицу для создания файла. Если вы абсолютно должны отображать форматы даты и времени ISO с SQL Server, делайте это только во время отображения. Я не могу подчеркнуть достаточно... НЕ сохраняйте отформатированные даты/время в SQL Server.
{Edit}. Причин для этого много, но наиболее очевидным является то, что даже при хорошем формате ISO (который можно сортировать), все будущие вычисления и поиски даты (для поиска всех строк в конкретном месяце, например) потребуют, по крайней мере, неявного преобразование (которое занимает дополнительное время), и если сохраненная форматированная дата не соответствует формату, который вам в настоящее время нужен, вам необходимо сначала преобразовать его в дату, а затем в нужный формат.
То же самое справедливо и для кода переднего конца. Если вы сохраняете отформатированную дату (которая является текстом), она требует, чтобы одни и те же символы отображали локальный формат даты, определенный либо окнами, либо приложением.
Моя рекомендация - всегда хранить дату/время как DATETIME или другой временный тип данных и форматировать только дату во время отображения.
У вас есть два варианта, когда речь идет о датах ISO.
В целом, если вы специально фильтруете только значения Дата или хотите сохранить дату в нейтральном режиме. Корпорация Майкрософт рекомендует использовать формат нейтрального языка ymd
или y-m-d
. Каковы оба действительных формата ISO.
Обратите внимание, что форма '2007-02-12' считается только нейтральной по языку для типов данных DATE, DATETIME2 и DATETIMEOFSFS.
Из-за этого ваша самая безопасная ставка заключается в сохранении/фильтрации на основе формата всегда netural ymd
.
Код:
select convert(char(10), getdate(), 126) -- ISO YYYY-MM-DD
select convert(char(8), getdate(), 112) -- ISO YYYYMMDD (safest)