Преобразование между нелогично отформатированными датами (смена / слэш / на -dash-)

Я перестраиваю веб-приложение из старого со многими несоответствиями. Мне нужно перенести все данные из старой базы данных в нашу новую структуру.

В старой базе данных даты были сохранены в БД MySQL как VARCHAR . Мы находимся в Великобритании, поэтому даты были написаны в формате DD / MM / YYYY . Мне нужно преобразовать эти даты в собственный формат DATE() MySQL.

Проблема в том, что PHP по умолчанию полагает, что даты находятся в «американском» формате (MM / DD / YYYY), потому что они были первоначально разделены с / а не – и - заставляют PHP предположить, что они являются «европейскими».

Я делаю это до сих пор, чтобы преобразовать их:

 $start_date = date('Ym-d', strtotime($query->row('startdate'))); 

Где $query->row('startdate') – это столбец старой базы данных, в котором $query->row('startdate') даты. Проблема в том, что мне нужно сначала переключить все 21/03/1994 с на 21-03-1994 .

Как я могу это сделать?

 $start_date = date('Ym-d', strtotime(str_replace('/', '-', $query->row('startdate')))); 

Или еще лучше – просто измените данные в базе данных:

 UPDATE `table` SET `startdate` = REPLACE(`startdate`, '/', '-'); 

… и затем преобразуйте поле в тип DATE.

—- РЕДАКТИРОВАТЬ —-

На самом деле, у полковника Шрапнела есть точка … Я бы упустил из виду тот факт, что дата требует реверсирования, так что это ГГГГ-ММ-ДД; если исходная дата находится в формате DD / MM / YYYY, лучший запрос может быть примерно таким:

 UPDATE `table` SET `date` = CONCAT(SUBSTRING(`date`, 7), '-', SUBSTRING(`date`, 4, 2), '-', SUBSTRING(`date`, 1, 2)) 

Который перевернет компоненты в строку, которая может быть преобразована в DATE … она не будет работать, если исходная строка даты не использует 1/6/2011 нули 1/6/2011 например … нужно будет сделать что-то немного умнее в этом случае.

MySQL имеет функцию Replace (), которая может быть самым простым способом сделать это.

Это ссылка на API 5.0: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

ПОЧЕМУ беспокоиться со всеми этими событиями времени, когда вам нужно просто простейшее манипулирование строками из двух ходов?

 $tmp = explode("/",$query->row('startdate')); $date = "$tmp[2]-$tmp[1]-$tmp[0]"; 

но, как сказал Крис, вам не нужно включать PHP в эту операцию, так как вы можете преобразовать его с помощью единого SQL-запроса, используя аналогичные строковые манипуляции в запросе.

Используйте str_replace следующим образом:

 $start_date = date('Ym-d', strtotime(str_replace('-','/',$query->row('startdate')))); 

Это, конечно, уродливое и быстрое решение – YMMV.

Если вы привязаны к PHP, почему бы не проанализировать данные, нормализовать их и продолжить? Например, с помощью sscanf :

 $r = sscanf($varcharDate, '%d/%d/%d', $day, $month, $year); if ($r !== 3) { throw new Exception(sprintf('Invalid date format given: %s', $varcharDate)); }