Как преобразовать значение даты Varchar в тип данных Date в MySQL с использованием Case When и Str_to Date - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть список дат в таблице, которая в настоящее время содержит этот столбец как тип данных Varchar. То, что я хочу сделать, это очистить эту таблицу, и первый шаг - преобразовать этот столбец в тип данных Date и преобразовать все значения, которые у меня должны быть согласованными.

Ниже приведены мои операции создания и вставки. операторы, это образец столбца даты:

Создать таблицу:

CREATE TABLE “BU_TABLE_DATES" 
   (           "END_DATE" VARCHAR2(255 BYTE)
   );

Вставить операторы:

INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('01/01/2018');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13-Jan-18');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13-Jan-19');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13-Jan-19');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13-Jan-20');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13/01/2018');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13/01/2019');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13/01/2020');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('17/07/2017');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('17/07/2019');

Что бы я хотел, чтобы конечный результат выглядел например, следующий (все данные типа Дата)

End_Date
01/01/2018
13/01/2018
13/01/2019
13/01/2019
13/01/2020
13/01/2018
13/01/2019
13/01/2020
13/01/2020
17/07/2017
17/07/2019

В настоящее время мне удалось написать следующий код, используя инструкцию case и str_to_date, которые помогают преобразовать значения, где месяц - только 2 символа, а также как я могу иметь формат для отображения года в конце, даже если код написан таким образом.

Мой запрос

SELECT
    End_Date,
    CASE End_Date
        WHEN substring(End_Date,2,1) = '-' THEN STR_TO_DATE (End_Date,'%d-%m-%Y')
        WHEN substring(End_Date,2,1) = '/' THEN STR_TO_DATE (End_Date,'%d/%m/%Y')
    ELSE STR_TO_DATE (End_Date,'%d/%m/%Y') END as End_Date_New
FROM
    BU_TABLE_DATES
;

Вывод

End_Date    End_Date_New
01/01/2018  2018-01-01
13-Jan-18   (null)
13-Jan-19   (null)
13-Jan-19   (null)
13-Jan-20   (null)
13/01/2018  2018-01-13
13/01/2019  2019-01-13
13/01/2020  2020-01-13
13/01/2020  2020-01-13
17/07/2017  2017-07-17
17/07/2019  2019-07-17

Наконец в код, который я создаю новый столбец, но я хочу просто изменить тип данных существующего столбца, но в настоящее время нашел способ создать новый столбец, а затем подумал, что может быть лучше удалить старый d, но в идеале нужно, чтобы это работало с 1-м столбцом.

Хотелось бы получить совет о том, как лучше всего с этим справиться.

Заранее спасибо.

1 Ответ

1 голос
/ 06 февраля 2020

Вы можете использовать следующие, чтобы преобразовать строки в даты. Вы действительно должны использовать DATE -datatype при сохранении дат. Использование VARCHAR для дат только приведет к неприятностям.

SELECT
  End_Date,
  CASE substring(End_Date,3,1)
    WHEN '-' THEN STR_TO_DATE(End_Date,'%d-%b-%y')
    WHEN '/' THEN STR_TO_DATE(End_Date,'%d/%m/%Y')
  END as End_Date_New
FROM 
  BU_TABLE_DATES

См. Оператор CASE и параметры функции STR_TO_DATE (аналогично DATE_FORMAT s) из руководства.

...