Я импортировал CSV-файл в MySQL 5.7, и мне нужно изменить дату, чтобы я мог управлять ею позже.
Импортированные данные в настоящее время находятся в столбце localDate, который необходимо изменить. Это выглядит так:
Пн, 24 июня 2024 г., 17:12:18 GMT-0400 (восточное летнее время)
У меня уже есть PHP-код для размещения даты так, как мне нужно:
// extract date from string.
$original_date = substr($row['localDate'], 3,12);
// convert to yyyy-mm-dd
$local_date = date("Y-m-d", strtotime($original_date));
2024-06-24
По сути, мне просто нужно знать, как копировать из столбца localDate в новый столбец local_date при обновлении даты, используя имя моей переменной $local_date.
Я бы не использовал substr
. Функции PHP datetime могут справиться с этим как есть.
возможный дубликат stackoverflow.com/a/6028533/208809
Извините за путаницу. Я хочу получить данные из localDate, изменить их на гггг-мм-дд, а затем вставить новую отформатированную дату в столбец local_date.
Импортируйте с помощью предварительной обработки ввода, преобразуйте значение из CSV в правильный формат с помощью STR_TO_DATE() и сохраните это преобразованное значение.
@Ronaldo, тогда моего первого комментария должно быть достаточно? Если только нет какого-то аспекта, о котором вы нам не сообщили.
Зачем это делать в PHP? Сделайте это в SQL: UPDATE tablename SET local_date = STR_TO_DATE(localDate, '<format string>')
Согласен с Бармаром. Выполнение этого процедурно в цикле для выдачи всех этих операторов UPDATE
будет медленным даже на маленькой таблице. Вот как это сделать напрямую в MySQL: dbfiddle.uk/XlLjW0fP
@JNeville, ты прав. Ваше решение намного лучше. Спасибо. Пожалуйста, опубликуйте ответ как ответ, чтобы я мог отметить его как отвеченный.
Вероятно, вы на правильном пути. Но я не думаю, что функция substr
нужна. PHP может справиться с этим лучше.
$original_date = "Mon Jun 24 2024 17:12:18 GMT-0400 (Eastern Daylight Time)";
$dateString = preg_replace('/\s+GMT.*$/', '', $original_date); // it will remove timezone related information from the string
$local_date = date('Y-m-d',strtotime($dateString));
Передача строки, содержащей часовой пояс, вызовет исключение. Вместо этого позвольте вам извлечь из него информацию о дате и времени.
Использование substr
— не лучший способ. Что, если в функции будет больше символов, чем 12? В это время ваша логика не сможет проанализировать дату и время.
Поскольку искомая ведущая часть выражения даты и времени имеет предсказуемую длину, реализация метода регулярного выражения требует слишком много усилий. substr()
в данном случае гораздо более идеален. Возможно, даже лучше, используйте законный анализатор даты и времени, а затем отформатируйте проанализированное значение по своему усмотрению.
Как упоминалось в комментариях @Barmar и меня, циклическое выполнение обновлений, как правило, является плохой идеей, поскольку каждое обновление необходимо передавать по сети в вашу базу данных. Даже на маленьком столе это будет медленное решение. Вместо этого добавление нового столбца и запуск одного оператора обновления будет намного быстрее.
CREATE TABLE imported_csv (id int, localDate VARCHAR(100));
INSERT INTO imported_csv VALUES (1, 'Mon Jun 24 2024 17:12:18 GMT-0400 (Eastern Daylight Time)'), (2, 'Tue Jun 25 2024 13:22:44 GMT-0400 (Eastern Daylight Time)');
ALTER TABLE imported_csv ADD COLUMN local_date DATE;
/*One update statement to update all records*/
UPDATE imported_csv
SET local_date = STR_TO_DATE(SUBSTRING(localDate, 5, 11), "%M %d %Y");
SELECT * FROM imported_csv;
+-----------------------------------------------------------+------------+
| localDate | local_date |
+-----------------------------------------------------------+------------+
| Mon Jun 24 2024 17:12:18 GMT-0400 (Eastern Daylight Time) | 2024-06-24 |
| Tue Jun 25 2024 13:22:44 GMT-0400 (Eastern Daylight Time) | 2024-06-25 |
+-----------------------------------------------------------+------------+
Хорошее практическое правило заключается в том, что если вы решаете проблему, запуская sql (любой sql) в цикле, вероятно, существует лучший способ ее решения на основе наборов.
Вероятно, после этого вы вставляете содержимое
$row
в базу данных? Если да, то просто назначьте новый ключ массива, как и в любом другом массиве PHP, например.$row["local_date"] = date("Y-m-d", strtotime($original_date))
. Затем ваш последующий код сможет использовать эти данные во время операции вставки SQL. Предполагается, что вы хотите, чтобы это было в новом столбце под названием «local_date». В одном месте сообщения вы говорите, что хотите выполнить запись в новый столбец local_date, но ранее в сообщении вы сказали, что хотите изменить существующий столбец local_date.