2010-11-23 3 views
4

Я работаю над таблицей, которая имеет два формата дат, хранящихся в поле, некоторые из которых находятся в мм/дд/гг, а новые записи - в годах/мм/дд, как и должно быть.Обновление формата даты в mysql

Я хочу, чтобы выполнить запрос, как этот

UPDATE table 
    SET date_field = DATE_FORMAT(date_field, '%Y/%m/%d') 
WHERE date_field = DATE_FORMAT(date_field, '%m/%d/%y') 

Но это просто не получается. Одним из результатов, который я получил, было то, что он просто принимал данные% m и превращал их в% Y и действительно испортил данные.

Любые мысли?

+1

какой тип столбца date_field? если это дата или временная метка - вы не можете изменить порядок Ymd на mdy – Mikhail 2010-11-23 19:05:54

ответ

13

Вы хотите использовать функцию STR_TO_DATE, а не DATE_FORMAT. Кроме того, я предполагаю, что вы только хотите обновить неверные даты, поэтому, я думаю, вы могли бы сделать это:

UPDATE your_table 
SET date_field = DATE(STR_TO_DATE(date_field, '%m/%d/%Y')) 
WHERE DATE(STR_TO_DATE(date_field, '%m/%d/%Y')) <> '0000-00-00'; 

P.S. Таблицы содержат столбцы, а не поля. И вы не должны использовать строковый тип для хранения ваших дат, но тип DATE

+0

Спасибо, это должно получиться, что выпрямилось очень хорошо. Затем мы можем двигаться вперед, чтобы выровнять остальную часть сайта. Он перешел от ASP к PHP и MS SQL к MySQL! Удивительно, что он все еще стоит! Ха! – 2010-11-24 15:50:19

4

Вы хотите использовать STR_TO_DATE, чтобы сначала преобразовать неверную строку в объект реальной даты, затем используйте DATE_FORMAT, чтобы вернуть ее в строку нужного формата.

Кроме того, ваше состояние WHERE не будет работать так. Вы должны искать строки неправильного формата, используя LIKE.

UPDATE your_table SET date_field = 
    DATE_FORMAT(STR_TO_DATE(date_field, '%m/%d/%y'), '%Y/%m/%d') 
WHERE date_field LIKE '__/__/____' 
+0

Спасибо, это сработало – 2015-02-16 11:23:39

1

Мысли? Ах да, на самом деле три:

  • не изобретать колесо. Да, да, я знаю, что искушение делать с нуля то, что изобретали только миллионы людей (не предполагал сарказм), но у MySQL есть хороший, эффективный и удобный формат DATE, используйте это; только форматирование на входе/выходе. Это позволяет вам избегать подобных микширования данных (сама дата) и презентации (формат даты).

  • Что касается данных, восстановления заведомо исправный резервного копирования (у вас есть резервные копии, не так ли?) - в общем случае, нет дурака способ сказать непревращенный г/м/д из уже преобразованных m/d/y, и даты даны для любых практических целей. (особенно в 2010 году - например, 08/10/09 может означать несколько действительных дат).

  • Кроме того, какая идея состоит в том, чтобы хранить только 2 цифры даты? Это точно такой близорукий копейки, который привел к тому, что время и деньги были равны Y2K. (избегайте, если вы сохранили дату, знаете ли, в формате даты).

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