запрос sql конвертировать текстовое поле дд / мм / гггг в поле даты гггг-мм-дд - PullRequest
8 голосов
/ 10 ноября 2010

я импортировал файл CSV в MySQL с датами дд / мм / гггг Теперь нужен запрос для преобразования его из текста в формат даты гггг-мм-дд

Приветствия

S.

Ответы [ 4 ]

15 голосов
/ 10 ноября 2010

Вы можете использовать STR_TO_DATE (str, format) MySQL.

Пример переключения my_date_col для преобразованного:

BEGIN;
 ALTER TABLE `date_test` 
  ADD COLUMN `my_date_col_converted` DATE;

 UPDATE `date_test` 
  SET `my_date_col_converted` = STR_TO_DATE(`my_date_col`, '%d/%c/%Y');

 ALTER TABLE `date_test` 
  DROP COLUMN `my_date_col`;

 ALTER TABLE `date_test` 
  CHANGE COLUMN `my_date_col_converted` `my_date_col` DATE;
COMMIT;
2 голосов
/ 10 ноября 2010

Вы можете использовать STR_TO_DATE() следующим образом, чтобы преобразовать ваш текст в DATE:

STR_TO_DATE( datefield , "%d/%m/%Y" )

Если вам нужно это DATE в определенном формате, вы можете использовать DATE_FORMAT().
Это, вероятно, не нужно в вашем случае, но вот пример для полноты:

DATE_FORMAT( STR_TO_DATE( datefield , "%d/%m/%Y" ) , "%Y/%m/%d" )

Таким образом, вы можете сделать это по всей таблице с помощью одного UPDATE, чтобы заменить текущие данные переформатированными данными (сохраняя при этом тип данных):

UPDATE tableName
SET originalDate = DATE_FORMAT(STR_TO_DATE(originalDate,"%d/%m/%Y" ),"%Y/%m/%d" );

Или, если вы хотите преобразовать тип данных столбца DATE, вы можете изменить таблицу, чтобы создать новый столбец в формате DATE, используйте указанное выше обновление, чтобы заполнить этот столбец, удалить исходный столбец, а затем ( по желанию) переименуйте новый столбец в старое имя.

ALTER tableName
ADD modifiedDate DATE;

UPDATE tableName
SET modifiedDate = DATE_FORMAT( STR_TO_DATE( originalDate ,"%d/%m/%Y" ) ,"%Y/%m/%d" );

ALTER tableName
DROP COLUMN originalDate; 

ALTER tableName
CHANGE COLUMN modifiedDate originalDate;
1 голос
/ 17 сентября 2012

Это должно работать, но это не так:

BEGIN;
 ALTER TABLE `date_test` 
  ADD COLUMN `my_date_col_converted` DATE;
 UPDATE `date_test` 
  SET `my_date_col_converted` = STR_TO_DATE(`my_date_col`, '%d/%c/%Y');
 ALTER TABLE `date_test` 
  DROP COLUMN `my_date_col`;
 ALTER TABLE `date_test` 
  CHANGE COLUMN `my_date_col_converted` `my_date_col` DATE;
COMMIT;

Также это должно работать: не работает

UPDATE db_test SET anticipated_court_date = DATE_FORMAT(STR_TO_DATE(anticipated_court_date,"%d/%m/%Y" ),"%Y-%m-%d" );

Версия сервера: 5.0.95-community-log MySQL Community Edition (GPL)

Однако это работает:

SELECT STR_TO_DATE('8/31/12', '%m/%d/%Y'); // WORKS

Использование MySQL - я не смог найти ни одного решения, которое работало бы надежно. Даже та же самая точная дата не была успешно преобразована.

The solution I've found is this:  PHP
$user_date = "8/31/12"; // WORKS
$mysql_date = date('Y-m-d H:i:s', strtotime($user_date));
0 голосов
/ 21 июня 2015

Выше было полезно, но у меня сработало следующее:

ALTER TABLE `tablename` ADD `newcolumn` DATE NOT NULL ;
UPDATE `tablename` SET `newcolumn`=STR_TO_DATE(`oldcolumn`, '%d/%c/%Y')

Теперь удалите старый столбец (если хотите).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...