Даты вывода в формате 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