Я перестраиваю веб-приложение из старого со многими несоответствиями. Мне нужно перенести все данные из старой базы данных в нашу новую структуру.
В старой базе данных даты были сохранены в БД 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)); }