Изменение формата данных в столбце

Попытка изменения столбца даты с YYYYMMDD на MMDDYYYY при сохранении значения varchar. В настоящее время моя колонка задана как varchar (10). Есть ли способ изменить строки в массовых количествах, потому что у меня есть тысячи строк, которые нуждаются в преобразованном формате.

Например:

|   ID    |    Date    |
------------------------
|    1    | 20140911   |
|    2    | 20140101   |
|    3    | 20140829   |

Я хочу, чтобы моя таблица выглядела так:

|   ID    |    Date    |
------------------------
|    1    | 09112014   |
|    2    | 01012014   |
|    3    | 08292014   |

Бонусный вопрос: может ли это возникнуть при попытке конвертировать этот столбец, если есть такие данные, как 91212 за 09/12/2012 или что-то вроде 1381, которое должно быть 08/01/2013?

Ответ 1

Вместо сохранения форматированной даты в отдельном столбце; просто исправьте формат при извлечении с помощью функции STR_TO_DATE (как вы сказали, ваши даты хранятся в виде строки /varchar ), как показано ниже. Опять же, как предложили другие, не сохраняйте данные date в виде строки, а используйте вместо этого тип данных datetime

SELECT  STR_TO_DATE(`Date`, '%m/%d/%Y')
FROM    yourtable

EDIT:

В этом случае я бы предложил не обновлять исходную таблицу. Скорее сохраните эти отформатированные данные в view или в отдельной таблице, как показано ниже

create view formatted_date_view
as
    SELECT  ID,STR_TO_DATE(`Date`, '%m/%d/%Y') as 'Formatted_Date'
    FROM    yourtable

(ИЛИ)

create table formatted_date_table
 as
SELECT  ID,STR_TO_DATE(`Date`, '%m/%d/%Y') as 'Formatted_Date'
FROM    yourtable

EDIT1:

В случае использования SQL Server CONVERT используется функция CONVERT(datetime, Date,110). так что было бы (здесь 110 - стиль для формата mm-dd-yyyy)

    SELECT  ID,convert(datetime,[Date],110) as 'Formatted_Date'
    FROM    yourtable

(ИЛИ)

CAST, как показано ниже (только недостаток, вы не можете использовать какой-либо конкретный стиль для форматирования даты)

    SELECT  ID, cast([Date] as datetime) as 'Formatted_Date'
    FROM    yourtable

Ответ 2

Решение MS SQL Server:

С каким SQL вы пытаетесь?

MSSQL Server 2008 R2

Вы можете использовать функцию Convert в поле date. Вы должны указать формат даты. Стиль. Для формата mm/dd/yyyy значение стиля 101.

Используя значение стиля, ваш оператор обновления может быть:

UPDATE table_name
  SET date = CONVERT( VARCHAR, date, 101 ) 

Обратитесь к:


Решение MySQL:

он должен оставаться в varchar или int, а даты - yyyymmdd, и мне нужно изменить тысячи строк данных в формате mmddyyyy.

Измените на date с помощью str_to_date, а затем снова измените на строку, используя date_format.

UPDATE table_name
  SET date = DATE_FORMAT( STR_TO_DATE( date, '%Y%m%d' ), '%m%d%Y' )

Значение 20140911 при преобразовании из формата yyyymmdd в mmddyyyy сохранит ведущий 0 как 09112014.

Бонусный вопрос. Возникла бы проблема при попытке конвертировать этот столбец, если для 09/12/2012 есть такие данные, как 91212 или что-то вроде 1381, которое должно быть 08/01/2013

Вы можете использовать str_to_date( '91212', '%c%e%y' ) для преобразования того же самого в действительный объект date. Но MySQL, хотя и определяет для поддержки одиночных цифр month и date, он не будет правильно анализировать такую ​​дату и возвращает NULL в таких форматах.

mysql> select str_to_date( '91212', '%c%e%y' ) s1, str_to_date( '091212', '%c%e%y' ) s2;
+------+------------+
| s1   | s2         |
+------+------------+
| NULL | 2012-09-12 |
+------+------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+------------------------------------------------------------+
| Level   | Code | Message                                                    |
+---------+------+------------------------------------------------------------+
| Warning | 1411 | Incorrect datetime value: '91212' for function str_to_date |
+---------+------+------------------------------------------------------------+
1 row in set (0.00 sec)