Как в SQL Server распечатать даты с начальными пробелами для полей месяца и часа?

#sql-server

#sql-server

Вопрос:

У меня есть требование возвращать даты из базы данных в формате, подобном этим датам:

 Feb 25 2015  7:36PM
Jun  4 2015  9:54AM
Sep 17 2015  1:10PM
Apr  5 2013 12:00AM
 

Формат этих дат почти такой MMM dd yyyy hh:mmtt *, за исключением того, что мне нужны начальные пробелы, а не начальные нули.

Вот моя попытка вернуть даты в этом формате:

 declare @dt datetime = '2015-06-04 09:54:15'
select replace(format(@dt, 'MMM dd yyyy hh:mmtt'), ' 0', '  ')
-- Jun  4 2015  9:54AM
 

Я просто заменяю «0» двумя пробелами.

  1. Это правильный способ сделать это?
  2. Есть ли лучший способ сделать это?

Я не могу этого сделать на C #, потому что у меня нет контроля над требованиями. Я бы, вероятно, сделал то же самое в C #, если бы мог.

* Использование пользовательских строк форматирования даты и времени SQL Server, которые, я думаю, эквивалентны C # https://msdn.microsoft.com/en-us/library/8kb3ddd4 (v = против 110).aspx

Комментарии:

1. Если это вообще возможно, я бы настоятельно рекомендовал оставить форматирование интерфейсу. Если вы настраиваете форматирование из базы данных, вы не сможете правильно выполнять такие вещи, как сортировка.

2. Какая версия SQL?

3. @ajeh Microsoft SQL Server 2012 — 11.0.5058.0 (X64)

Ответ №1:

Запустите следующий скрипт, который даст вам нужный результат, хитрость заключается в добавлении двух пробелов между MMM dd, dd гггг и гггг чч: mmtt

 declare @dt datetime = '2015-06-04 09:54:15'
select replace(format(@dt, 'MMM  dd  yyyy  hh:mmtt'), ' 0', '  ')


set  @dt = '2015-12-31 19:54:15'
select replace(format(@dt, 'MMM  dd  yyyy  hh:mmtt'), ' 0', '  ')

set  @dt = '2015-12-31 00:00:00'
select replace(format(@dt, 'MMM  dd  yyyy  hh:mmtt'), ' 0', '  ')