Функция FORMAT() в SQL Server – это мощный инструмент, введенный в SQL Server 2012, который позволяет легко форматировать типы данных, особенно даты. В этой статье мы рассмотрим различные способы использования функции FORMAT() для манипулирования и представления дат в результирующих наборах.
Прежде чем мы начнем, важно отметить, что хотя функция FORMAT() удобна и проста в использовании, она имеет некоторые соображения о производительности. В ситуациях, где производительность критична или вовлечены большие наборы данных, рекомендуется использовать другие функции, такие как CONVERT или CAST. Аарон Бертранд написал проницательную статью, в которой сравнивается производительность функции FORMAT() с CONVERT с различными типами данных.
Базовый синтаксис функции FORMAT() выглядит следующим образом: FORMAT(value, format, culture). Параметры value и format являются обязательными, в то время как параметр culture является необязательным. Значение может быть числовым или датой/временем, но строки не поддерживаются. Это означает, что вы можете использовать int, float, money, а также различные типы даты, времени и datetime.
Параметр format определяет, как будет отформатировано значение. Существует множество вариантов форматирования, включая длинные и короткие даты, полные даты, общие даты, короткие времена, универсальные даты и другие. Эти форматы могут быть представлены односимвольными кодами или более длинными строками. Кроме того, вы можете указать код культуры для форматирования значения в соответствии с определенным языком и культурой. Если культура не указана, будет использоваться значение по умолчанию для сеанса.
Важно отметить, что функция FORMAT() возвращает строку NVARCHAR(). Это означает, что если вы ожидаете дату или число, вам нужно выполнить неявное или явное преобразование. Кроме того, если ваша система в основном работает с varchar() или не-Unicode строками, передача отформатированного результата в другой код может привести к неявным преобразованиям, которые могут повлиять на производительность.
Функцию FORMAT() можно использовать в любом месте, где принимается функция в T-SQL. Однако рекомендуется избегать ее использования в ON или WHERE выражениях, так как это может негативно сказаться на производительности и потенциально препятствовать использованию индексов.
Давайте рассмотрим простой пример, чтобы проиллюстрировать, как функцию FORMAT() можно использовать для форматирования дат. Предположим, у нас есть переменная, хранящая значение даты, и мы хотим отформатировать его как американскую дату. Мы можем сделать это с помощью следующего кода:
DECLARE @dt DATETIME2 = SYSDATETIME();
SELECT FORMAT(@dt, 'd') AS formatted_date;
Это вернет дату в формате короткой даты по умолчанию для локали США, например “4/11/2018”.
Теперь давайте рассмотрим некоторые из различных вариантов форматирования, доступных с помощью функции FORMAT(). Для удобства просмотра мы будем использовать ту же переменную, хранящую текущую дату и время во всех примерах:
DECLARE @dt DATETIME2 = SYSDATETIME();
Вот некоторые примеры различных форматов и их соответствующих результатов:
SELECT 'Формат по умолчанию', FORMAT(@dt, 'd')
UNION
SELECT 'Длинная дата', FORMAT(@dt, 'D')
UNION
SELECT 'Полная дата и короткое время', FORMAT(@dt, 'f', 'us-en')
UNION
SELECT 'Полная дата и длинное время', FORMAT(@dt, 'F', 'us-en')
UNION
SELECT 'Общая дата и короткое время', FORMAT(@dt, 'g', 'us-en')
UNION
SELECT 'Общая дата и длинное время', FORMAT(@dt, 'G', 'us-en')
UNION
SELECT 'Универсальная дата и короткое время', FORMAT(@dt, 'u', 'us-en')
UNION
SELECT 'Сортируемая дата и короткое время', FORMAT(@dt, 's', 'us-en')
UNION
SELECT 'RFC 1123 r Дата и время', FORMAT(@dt, 'r', 'us-en')
UNION
SELECT 'Короткое время', FORMAT(@dt, 't', 'us-en')
UNION
SELECT 'Длинное время', FORMAT(@dt, 'T', 'us-en')
UNION
SELECT 'Универсальная дата и длинное время', FORMAT(@dt, 'U', 'us-en');
Эти примеры демонстрируют различные форматы, такие как короткая дата, длинная дата, полная дата с коротким временем, полная дата с длинным временем, общая дата с коротким временем, общая дата с длинным временем, универсальная дата с коротким временем, сортируемая дата с коротким временем, RFC 1123 r дата и время, короткое время, длинное время и универсальная дата с длинным временем.
Как видите, функция FORMAT() предоставляет широкий спектр вариантов форматирования для удовлетворения различных требований. Однако важно отметить, что результаты могут варьироваться в зависимости от указанной культуры. Например, изменение культуры на Великобританию приведет к другим результатам.
Также возможно создание пользовательского формата с помощью функции FORMAT(). Вы можете использовать различные токены в строке формата для управления отображением. Например, вы можете установить формат дня, месяца, года с помощью следующего кода:
SELECT 'Пользовательский формат', FORMAT(@dt, 'dd MM yyyy', 'en-US');
Это вернет дату в формате “11 04 2018”.
Если вы хотите использовать собственные разделители, вы можете экранировать токены с помощью обратной косой черты. Например:
SELECT 'Пользовательский формат