2013-07-24 3 views
1

Я работаю с данными, в которых разработчик до меня был ленив и не хранил дату в заданном формате. Его в виде varchar, а не в datetime. Излишне говорить, что мне осталось заняться сортировкой данных.Mysql Сохранено несколько неправильных форматов даты

Its в двух форматах

1) {dd}/{mm}/{yyyy} {hh}:{mm} 
2) {dd}.{mm}.{yyyy} {hh}:{mm} 

Я хотел бы, чтобы убедиться, что он всегда возвращается в тузде DateFormat. Следующий запрос получит первый.

SELECT 
    str_to_date(a.rentalstart, '%d/%m/%Y %k:%i'), 
    a.* 
FROM 
    jupiter1.table a 
ORDER by createtime DESC 

Как бы объединить эти два? Мне также понадобится по умолчанию нормальное mysql datetime, если оно будет соответствовать.

{yyyy}-{mm}-{dd} {hh}:{mm}:{ss}

ответ

2
SELECT CASE WHEN a.rentalstart LIKE "%/%/% %:%" 
      THEN str_to_date(a.rentalstart, '%d/%m/%Y %k:%i') 
      WHEN a.rentalstart LIKE "%.%.% %:%" 
      THEN str_to_date(a.rentalstart, '%d.%m.%Y %k:%i') 
      ELSE CAST(a.rentalstart AS DATETIME) 
     END AS rentalstart_good, 
     a.* 
FROM ... 
+0

спасибо, что ответ сработал. Я особенно люблю использование CAST –

+0

@Robbo_UK: На самом деле, 'CAST()' необходимо для того, чтобы столбец 'rentstart_good' в наборе результатов был временным типом данных, иначе он будет строкой. – eggyal

0
SELECT 
    str_to_date(replace(replace(a.rentalstart, '.', '-'), '/', '-'), if(a.rentalstart like '%-%-%-%', '%Y-%m-%d %k:%i', '%d-%m-%Y %k:%i')), 
    a.* 
FROM 
    jupiter1.table a 
ORDER by createtime DESC 

Решает ли это проблему?
Отредактировано с учетом вашего состояния по умолчанию также

1

Вы можете просто сделать REPLACE. Он преобразует все записи в формате {dd}.{mm}.{yyyy} {hh}:{mm} и преобразует их в формат данных DateTime.

SELECT STR_TO_DATE(REPLACE(a.rentalstart, '/', '.'), '%d.%m.%Y %k:%i') newDate, 
     a.* 
FROM jupiter1.table a 
ORDER BY newDate DESC 
+1

«* Мне также нужно было бы это по умолчанию нормальный тузд DateTime, если это соответствует' {гггг} - {мм} - {дд} {чч}: {мм}: {сс} '* « – eggyal

Смежные вопросы