Измените строку из одного столбца перед вставкой в ​​другой

Я импортировал 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.

Вероятно, после этого вы вставляете содержимое $row в базу данных? Если да, то просто назначьте новый ключ массива, как и в любом другом массиве PHP, например. $row["local_date"] = date("Y-m-d", strtotime($original_date)). Затем ваш последующий код сможет использовать эти данные во время операции вставки SQL. Предполагается, что вы хотите, чтобы это было в новом столбце под названием «local_date». В одном месте сообщения вы говорите, что хотите выполнить запись в новый столбец local_date, но ранее в сообщении вы сказали, что хотите изменить существующий столбец local_date.

ADyson 26.06.2024 17:17

Я бы не использовал substr. Функции PHP datetime могут справиться с этим как есть.

user3783243 26.06.2024 17:20

возможный дубликат stackoverflow.com/a/6028533/208809

Gordon 26.06.2024 17:29

Извините за путаницу. Я хочу получить данные из localDate, изменить их на гггг-мм-дд, а затем вставить новую отформатированную дату в столбец local_date.

Ronaldo 26.06.2024 17:30

Импортируйте с помощью предварительной обработки ввода, преобразуйте значение из CSV в правильный формат с помощью STR_TO_DATE() и сохраните это преобразованное значение.

Akina 26.06.2024 17:35

@Ronaldo, тогда моего первого комментария должно быть достаточно? Если только нет какого-то аспекта, о котором вы нам не сообщили.

ADyson 26.06.2024 17:51

Зачем это делать в PHP? Сделайте это в SQL: UPDATE tablename SET local_date = STR_TO_DATE(localDate, '<format string>')

Barmar 26.06.2024 18:39

Согласен с Бармаром. Выполнение этого процедурно в цикле для выдачи всех этих операторов UPDATE будет медленным даже на маленькой таблице. Вот как это сделать напрямую в MySQL: dbfiddle.uk/XlLjW0fP

JNevill 26.06.2024 18:45

@JNeville, ты прав. Ваше решение намного лучше. Спасибо. Пожалуйста, опубликуйте ответ как ответ, чтобы я мог отметить его как отвеченный.

Ronaldo 26.06.2024 18:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
13
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вероятно, вы на правильном пути. Но я не думаю, что функция 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() в данном случае гораздо более идеален. Возможно, даже лучше, используйте законный анализатор даты и времени, а затем отформатируйте проанализированное значение по своему усмотрению.

mickmackusa 01.07.2024 23:13
Ответ принят как подходящий

Как упоминалось в комментариях @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 |
+-----------------------------------------------------------+------------+

https://dbfiddle.uk/XlLjW0fP

Хорошее практическое правило заключается в том, что если вы решаете проблему, запуская sql (любой sql) в цикле, вероятно, существует лучший способ ее решения на основе наборов.

Другие вопросы по теме