Даты вывода в формате MMDDYYYY
У меня ниже script, который показывает YYYYMMDD
. Однако мне нужен результат в формате MMDDYYYY
.
Кто-нибудь может помочь? Я не хочу тире/хода/периодов между цифрами.
SELECT CONVERT(VARCHAR(10), RowUpdateDateTime, 112)
from MyTable
Результаты: 20141113
Я хочу, чтобы он выглядел как 11132014
.
Я попробовал синтаксис FORMAT
, но он продолжал работать навсегда.
Ответы
Ответ 1
Взгляните на CONVERT()
документацию: ни один из форматов не соответствует именно тому, что вы ищете. Похоже, что 110
является самым близким. Мы можем закончить, добавив вызов REPLACE():
SELECT REPLACE(CONVERT(VARCHAR(10), RowUpdateDateTime, 110),'-','') from MyTable
Я также удивляюсь, почему вы делаете это вообще. В большинстве случаев такое преобразование может быть более эффективно обработано вашим клиентским кодом.
Ответ 2
Это просто в SQL Server 2012.
Функция FORMAT
принимает стандартные шаблоны форматирования .NET, поэтому вы можете точно указать тот, который вы хотите, вместо того, чтобы манипулировать результатом приблизительно правильный.
SELECT FORMAT(RowUpdateDateTime,'MMddyyyy','en-us')
Однако я только заметил ваш комментарий, что вы уже пробовали это и столкнулись с проблемами производительности.
Это самый быстрый, который я пробовал до сих пор.
SELECT CONCAT(CASE
WHEN MONTH(D) < 10
THEN '0'
END, MONTH(D), CASE
WHEN DAY(D) < 10
THEN '0'
END, DAY(D), YEAR(D))
Тестирование против 10 000 000 дат заняло 12 секунд, против 21 секунды для REPLACE(CONVERT(VARCHAR(10), RowUpdateDateTime, 110),'-','')
и 180 секунд для версии FORMAT
.
Тест script (раскомментируйте тестируемый)
WITH
E1(N) AS
(
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
) -- 1*10^1 or 10 rows
, E2(N) AS (SELECT 1 FROM E1 a, E1 b) -- 1*10^2 or 100 rows
, E4(N) AS (SELECT 1 FROM E2 a, E2 b) -- 1*10^4 or 10,000 rows
, E8(N) AS (SELECT 1 FROM E4 a, E4 b) -- 1*10^8 or 100,000,000 rows
, Dates(D) AS
(
SELECT TOP (10000000) DATEADD(MILLISECOND, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),0) AS N FROM E8
)
SELECT
--12 Seconds
MAX(CONCAT(CASE WHEN MONTH(D) < 10 THEN '0' END, MONTH(D), CASE WHEN DAY(D) < 10 THEN '0' END, DAY(D), YEAR(D)))
--21 Seconds
--MAX(REPLACE(CONVERT(VARCHAR(10), D, 110),'-',''))
--180 Seconds
--MAX(FORMAT(D,'MMddyyyy', 'en-us')) --18
FROM Dates