Преобразовать или преобразовать гггг-мм-дд в дд-мон-гггг утра / час - PullRequest
0 голосов
/ 13 декабря 2018

Я задал вопрос о том, как конвертировать 07-DEC-18 01.00.54.984000 PM в 2018-12-07 13.00.54.984000, и получил отличный ответ по этой ссылке: Приведите или конвертируйте DD-MON-YYYY AM / PM в YYYY-MM-DD

DECLARE @DateTimeString varchar(30) = '07-DEC-18 01.00.54.984000 PM';
SELECT DATEADD(
      millisecond
    , DATEDIFF(millisecond, '', CAST(REPLACE(SUBSTRING(@DateTimeString, 11, 8), '.', ':') + RIGHT(@DateTimeString, 10) AS time))
    , CAST(LEFT(@DateTimeString, 9) AS datetime2)
    );

Этот вопрос теперь "закрыт / одобрен", поэтому я поставлю новый вопрос.

Я бы хотел сделать это 2018-12-07 13.00.54.984000 в 07-DEC-18 01.00.54.984000 PM.Это наоборот из моего первого вопроса.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Используя различные функции даты и времени и стили даты, был написан следующий запрос

DECLARE @TIME DATETIME='2018-12-13 09:58:00.513'

SELECT concat(day(@TIME) ,'-',LEFT(datename(month,@TIME),3), '-',
year(@TIME),' ' ,cast(@TIME as time) ,' ',RIGHT(CONVERT(varchar(15),cast(@TIME as time),100),2))

output

13-Dec-2018 09:58:00.5133333 AM
0 голосов
/ 13 декабря 2018
--to convert to ISO, first preserve the final '.' char by
--converting to a placeholder 'q', with the intention
--of switcing back to '.' at a later stage
--then remove the '-' characters to give ISO date format
--YYYYMMDD
--then change the remaining '.' chars to ':'
--then we switch q back to '.'
--then cast to a datetime2 format
-- from the datetime2 format, the FORMAT
--command is applied with a mask of 
--'dd-MMM-yy hh.mm.ss.FFFFFF tt'
--a final stage of convering to upper case
-- is then applied

SELECT  UPPER(
        FORMAT(
        CAST(
            REPLACE(
                    REPLACE(
                        REPLACE
                            (
                            STUFF(@dat, LEN(@DAT) + 1 - CHARINDEX('.', REVERSE(@DAT)),1,'q'),
                                '.', 
                                ':'             
                            )
                        ,'-', 
                        ''
                        )
                        ,'q',
                        '.'
                    )
            as datetime2
            ),
            'dd-MMM-yy hh.mm.ss.FFFFFF tt'
            )
            );
0 голосов
/ 13 декабря 2018

Прежде всего - лучший совет, который я могу вам дать, это прекратить использование строковых представлений значений DateTime.
Есть только одно место, где полезно использовать строковое представление dateTime, и это на уровне представления -Пользовательский интерфейс, который использует данные.

Сказав это, иногда невозможно изменить реализацию системы, и вы просто застряли на том, что у вас есть - так вот пример кода, как преобразовать строку, содержащую 2018-12-07 13.00.54.984000 в строку, содержащую 07-DEC-18 01.00.54.984000 PM.

Итак, первым шагом, очевидно, будет преобразование исходной строки в DateTime2 - но для этого вам нужно заменить точки между часами, минутами и секундами на двоеточия,Для этого вы можете использовать STUFF.

DECLARE @DateString varchar(30) = '2018-12-07 13.00.54.984000'

SELECT  CAST(STUFF(STUFF(@DateString, 17, 1, ':'), 14, 1, ':') AS DateTime2);

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

SELECT FORMAT(@DateTime, 'dd-MMM-yy hh.mm.ss.fffffff tt')

Весь сценарий:

DECLARE @DateString varchar(30), @Date DateTime2;

SET @DateString = '2018-12-07 13.00.54.984000'

SELECT  @Date = CAST(STUFF(STUFF(@DateString, 17, 1, ':'), 14, 1, ':') AS DateTime2)

SELECT FORMAT(@Date, 'dd-MMM-yy hh.mm.ss.fffffff tt') As Result    

Результат

07-Dec-18 01.00.54.9840000 PM
...