2010-11-19 3 views
1

У меня есть большая таблица дней рождения, которую я хочу преобразовать из столбца varchar в столбец даты.MYSQL: как конвертировать столбец VARCHAR, содержащий даты, в столбец DATE?

В таблице SQL является:

дата
CREATE TABLE `birthdays` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `uid` bigint(20) DEFAULT NULL, 
    `birthday_date` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM 

День рождения хранится в одном из двух способов: строки, как «05/26/1994» или иногда «03/14» (для людей, которые не хотят раскрыть свой год рождения).

Каков наилучший способ создать другую таблицу и сохранить дни рождения в столбце даты? Возможно ли это сделать только с использованием MySQL (и не использовать PHP или какой-либо другой посредник)?

Я нашел функцию STR_TO_DATE в MySQL. Должен ли я использовать это?

Спасибо!

+1

Вы не можете - дата состоит из ГГГ-ММ-ДД, информация о Годе будет отсутствовать. STR_TO_DATE – ajreal

ответ

2
SELECT IF(birthday_date RLIKE '[0-9]{2}/[0-9]{2}/[0-9]{4}',STR_TO_DATE(birthday_date,'%m/%d/%Y'),STR_TO_DATE(birthday_date,'%m/%d')); 

Это приведет к таким датам, как 0000-03-14 для строк, которые не имеют введенного года. Ваш сервер должен быть настроен, чтобы разрешить неверные даты (см. http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html)

+0

Спасибо! Это очень полезно. В общем, действительно ли даты, хранящиеся в году 0000, когда-либо вызывают проблемы? Я никогда не хранил дату или дату-время без определенного года назад. – eric

+0

Существует несколько вопросов. Наиболее очевидным будет сортировка этих дат (они будут группироваться в начале). Существуют также проблемы с переносимостью - если вам когда-либо понадобится перенести эти данные на другой сервер, вы должны убедиться, что это позволяет недействительные даты. Миграция на другую СУБД также может быть сложной задачей. – Mchl

+0

Минимальная поддерживаемая дата для DATETIME составляет 1000-01-01, поэтому вы можете использовать год 1000 вместо этого. – Mchl

1

Если вы конвертируете свою колонку в DateTime, вы будете не сможет, чтобы хранить даты типа «03/14», в течение которых отсутствует. Поэтому вместо этого я предлагаю сохранить это как есть, и, возможно, у вас есть еще один столбец для хранения даты, если вам это действительно нужно. Также есть встроенный триггер для преобразования данных из столбца varchar в dateTime.

Да, вы должны использовать метод STR_TO_DATE для своей цели.

+0

Спасибо за ответ. Общий вопрос: если таблица составляет миллионы строк, лучше ли хранить дни рождения в качестве варчара или пытаться хранить их в качестве дат (и, возможно, хранить дни рождения без лет как-то вроде 03/14/0000)? – eric

+1

@ Эрик - как правило, всегда лучше хранить даты как поле dateTime, вероятно, потому, что у вас будет стандартный формат для сохранения, и его легко сравнивать с другими датами. Например, для всех пользователей, родившихся в этом году. и т. д. Год 0000, я не знаю, действительно ли это, но да, вы можете дать какое-то неопределенное значение, например, 1500 или что-то еще. –

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