Как я могу получить дату и время из строки datetime в mysql - PullRequest
1 голос
/ 20 января 2020
id    user_id   created_at          status          amount
16924   4387 15-03-2019 15:33   bill created    149250
16925   4387 15-09-2019 15:47   bill created    444600
16926   4387 31-07-2019 15:31   bill created    879200

Я хочу отсортировать столбец created_at

Запрос, который я использовал, как показано ниже:

SELECT * FROM settlement ORDER BY CONVERT(DATE, created_at,101);

Здесь settlement - это имя моей таблицы. После запуска ошибки я получил:

ER_PARSE_ERROR: у вас есть ошибка в вашем синтаксисе SQL; обратитесь к руководству, соответствующему вашей MySQL версии сервера, чтобы узнать правильный синтаксис для использования рядом с 'create_at, 101) LIMIT 100' в строке 2

Есть ли способ получить отсортированный список?

Ответы [ 2 ]

2 голосов
/ 20 января 2020

CONVERT(...) - это SQL Синтаксис сервера, который не поддерживается в MySQL. Вместо этого можно использовать STR_TO_DATE():

ORDER BY STR_TO_DATE(created_at, '%d-%m-%Y %H:%i')

Второй аргумент STR_TO_DATE() является спецификатором формата. Для вашего случая использования:

  • %d: день месяца, число c (01..31)
  • %m: месяц, число c ( 01..12)
  • %Y: год, цифры c, четыре цифры
  • %H: час (00..23)
  • %i : Минуты, цифры c (00..59)

Примечание: исправить вашу модель данных ! Хранение дат в виде строк - это root многих зол. Вы быстро закончите преобразование строк в даты снова и снова в своих запросах, что подвержено ошибкам и крайне неэффективно, поскольку не позволяет базе данных использовать существующий индекс в столбце даты.

1 голос
/ 20 января 2020

created_at, должен иметь тип datetime.

При этом все операции SQL над ним не требуют особого внимания.

При получении вы можете использовать код приложения для отображения даты в формате США. Альтернативой является использование DATE_FORMAT .

Модификация может быть сделана с помощью:

ALTER TABLE settlement ADD created_at_real DATETIME;
UPDATE settlement SET created_at_real = STR_TO_DATE(created_at, '%d-%m-%Y %H:%i');
ALTER TABLE settlement DROP COLUMN created_at, RENAME COLUMN created_at_read TO created_at;

Тогда ваш запрос становится:

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