В SQL Server, как преобразовать дату в строку в формате M/D/YYYY? (без ведущих нулей, а не ММ/ДД/ГГГГ)

Прямо сейчас мой код имеет следующее преобразование для поля даты:

convert(varchar, Citation.PublishedOn, 101)

Однако это возвращает такие даты, как 01.03.2010. Запрос состоял в том, чтобы даты отображались как 01.03.2010 (без начальных нулей, но с 4-значным годом). Я просмотрел http://msdn.microsoft.com/en-us/library/ms187928.aspx, и я не вижу ничего, что явно исключало бы ведущие нули.

Как отформатировать дату, чтобы исключить ведущие нули?


person thursdaysgeek    schedule 25.05.2011    source источник


Ответы (4)


Вот как бы я это сделал:

DECLARE @dt datetime
SET @dt= Citation.PublishedOn
SELECT LTRIM(STR(MONTH(@dt)))+'/'+LTRIM(STR(DAY(@dt)))+'/'+STR(YEAR(@dt),4)

Вы выбираете свою дату, затем извлекаете из нее день, месяц и год и отсекаете начальные нули от месяца и дня, используя ltrim().

Если вы не хотите объявлять переменную, вы можете сделать это

SELECT LTRIM(STR(MONTH(Citation.PublishedOn)))+'/'+LTRIM(STR(DAY(Citation.PublishedOn)))+'/'+STR(YEAR(Citation.PublishedOn),4)

Однако это означало бы многократное извлечение одного и того же значения.

person Mark Costello    schedule 25.05.2011
comment
Бинго! Однако после преобразования в M/D/YYYY проблема заключается в том, что запрос «Упорядочить по дате» дает результат, например 01.04.2014, 10.04.2014, 07.04.2014, когда он должен быть 01.04.2014, 07.04.2014, 10.04.2014. Есть ли способ сохранить формат M/D/YYYY без изменений? Пожалуйста, предложите. Благодарю вас! - person Subrata Sarkar; 02.05.2014
comment
@NiladriSarkar, я думаю, вам нужно ЗАКАЗАТЬ по другому столбцу - person Darren Griffith; 16.05.2014
comment
Аналогично, SELECT CAST(МЕСЯЦ(@dt) как varchar) +'/'+ CAST(DAY(@dt) как varchar) +'/'+ CAST(YEAR(@dt) как varchar) - person Darren Griffith; 16.05.2014
comment
@SubrataSarkar Я бы вытащил поле реальной даты в отдельное поле (например, _date_sort) в вашем представлении, скрыл его от пользователя на любом дисплее и отсортировал по нему или отсортировал по столбцу даты в вашем представлении. Прямо сейчас сортировка сортируется на основе правил сортировки строк, поэтому сравнивается каждый символ, а не все значение, поскольку теперь это строковый тип. - person DavidScherer; 16.02.2019
comment
Лучшее решение для объединения строки даты, которое я нашел до сих пор с точки зрения удобства обслуживания, гибкости и интерпретируемости для будущих разработчиков (потому что, по моему опыту, если вы находитесь в 2008 году, вы, вероятно, будете там какое-то время, кажется, что магазины M$ дольше всего обновляют вещи) - person DavidScherer; 16.02.2019

Вы можете использовать функцию FORMAT, которая создана именно для таких вещей, хотя я согласен с тем, что если вы можете подождать, чтобы отформатировать ее на стороне клиента, вам может быть лучше, поскольку вы даете себе возможность использовать эти данные в качестве даты. в любой точке линии (ymmv - просто лучшая практика).

Пример:

FORMAT ( table.myDateColumn, 'd', 'en-US' )

См. http://msdn.microsoft.com/en-us/library/hh213505.aspx

Может быть недоступно в более старых версиях SQL Server.

person jinglesthula    schedule 13.12.2012
comment
Было ли это доступно и в SQL Server 2008? Если так, хорошо - жаль, что я не нашел это. Если нет, то он не ответил на заданный вопрос, но все же может быть полезен для других, у которых есть SQL Server 2012. - person thursdaysgeek; 14.12.2012
comment
Нет, это не так. Это выдаст сообщение об ошибке «ФОРМАТ» не является распознанным именем встроенной функции. - person Subrata Sarkar; 02.05.2014
comment
Является ли это предпочтительным методом SQL 2012 и более поздних версий? - person Heckflosse_230; 12.12.2014
comment
@Heckflosse_230 он, безусловно, позволяет избежать хитрых уловок, которые сложнее читать/обслуживать/отлаживать, и представляет собой встроенный и краткий способ справиться с этим. - person jinglesthula; 09.07.2015
comment
К сожалению, потребовалось M$ 23 года или около того, чтобы понять, что в некоторых случаях использования требуется возможность FORMAT() строк даты, а затем реализовать ее. Так что, если вы застряли на чем-то, предшествующем SQL Server 2012, вы предоставлены сами себе, чтобы собрать отформатированную строку даты. - person DavidScherer; 16.02.2019

Вы можете сделать:

STUFF(REPLACE('/'+CONVERT(CHAR(10), Citation.PublishedOn ,101),'/0','/'),1,1,'')

(На основе http://www.sqlservercentral.com/Forums/Topic1241877-1292-1.aspx.)

person yoel halb    schedule 12.03.2012

Я выбрал другой подход, который больше похож на трюк:

REPLACE(REPLACE('a'+ @table.date ),'a0',''),'a','')

Я думал, что это было шикарно, но я понял эту идею после неправильной интерпретации трюка STUFF выше. :)

person Mikhail Nitko    schedule 31.07.2012
comment
в качестве примечания - поскольку большинство людей, которые хотят видеть даты в единственном числе, хотят видеть их во главе всего поля даты - я предположил, что у вас уже есть дата в формате 101. то есть: 01.08.12 - person Mikhail Nitko; 01.08.2012
comment
Кроме того, имейте в виду, что если вы вырезаете из более крупного представления даты в стиле char(10), вам нужно будет заменить вхождения «a0» и «a» пробелами ala:--›, «a0» ,' ') и не удаляет аля: --› ,'a0','') - person Mikhail Nitko; 01.08.2012