Преобразование даты в строку

Речь пойдет о форматировании даты. Форматирование даты обычно используется для представления даты/времени в отчетах, подготовленных для печати. Как правило, такое форматирование выполняется средствами разработки отчетов. Однако и на уровне СУБД есть подобные возможности. Мы не будем здесь обсуждать вопрос о том, где лучше выполнять данное форматирование. Отметим лишь, что в ряде задач на сайте sql-ex.ru требуется представить результат выполнения запроса в том или ином конкретном формате.

SQL Server

Для форматирования даты в SQL Server используется функция CONVERT.

Будем рассматривать в качестве примера дату, возвращаемую следующим запросом:

select b_datetime 
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
b_datetime
2002-06-01 01:13:39.000

Например, чтобы получить из этого представления временной метки только дату в привычном нам формате “dd-mm-yyyy”, достаточно написать

select convert(varchar, b_datetime, 105)
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
01-06-2002

Для вывода в формате “mm-dd-yyyy” можно в функции CONVERT поменять параметр стиля на 110:

select convert(varchar,b_datetime,110)
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
06-01-2002

Для вывода одной лишь компоненты времени без миллисекунд используется стиль 108:

select convert(varchar, b_datetime, 108)
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
01:13:39

MySQL

В MySQL для форматирования даты используется функция DATE_FORMAT, в которой вторым параметром является маска, в соответствии с которой форматируется первый параметр типа даты/времени. Рассмотренные выше примеры для MYSQL можно переписать следующим образом:

select date_format(b_datetime,'%d-%m-%Y')
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
01-06-2002
select date_format(b_datetime,'%m-%d-%Y')
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
06-01-2002
select date_format(b_datetime,'%H:%i:%s')
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
01:13:39

Заметим, что “H” используется для представления 24-часового формата времени, а “h” - для 12-часового формата.

PostgreSQL & Oracle

Эти СУБД используют для форматирования функцию TO_CHAR с интуитивно понятной маской. Наши примеры для PostgreSQL будут выглядеть так:

select to_char(b_datetime,'dd-mm-yyyy')
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
01-06-2002
select to_char(b_datetime,'mm-dd-yyyy')
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
06-01-2002
-- 12-часовой формат
select to_char(b_datetime,'hh12:mi:ss')
from utb 
where b_datetime='2002-06-01T01:13:39.000';
-- 24-часовой формат
select to_char(b_datetime,'hh24:mi:ss')
from utb 
where b_datetime='2002-06-01T01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
01:13:39

Для Oracle принципиальных отличий нет. Чтобы примеры, приведенные для PostgreSQL, работали в Oracle, нам нужно знать, что строковое представление даты нужно явно преобразовывать к соответствующему темпоральному типу (при сравнениях с датой). Кроме того, не поддерживается стандартное представление временной метки с разделителем “T” между датой и временем. Например, последний пример в Oracle будет иметь вид:

select to_char(b_datetime,'hh24:mi:ss')
from utb 
where b_datetime=timestamp'2002-06-01 01:13:39.000';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]