Mysql str_to_date ничего не делает

У меня есть поле datecreated в моей базе данных, которая имеет тип varchar. К сожалению, я не могу изменить это поле на формат даты, поэтому я должен сделать это при выборе данных. Я пытаюсь отсортировать записи по дате (чтобы отображался последний год, месяц, день, час, минута, секунда). Формат поля выглядит следующим образом: дд-мм-гггг чч: мм: сс, поэтому в моем запросе я пытаюсь выполнить следующее, однако он абсолютно не упорядочивает:

SELECT * FROM submissions ORDER BY str_to_date(datecreated,'%d-%m-%Y %H:%i:%s') DESC

Все, что он делает, это отображает записи в соответствии с полем id...

1 ответ

Решение

Предполагая, что все datecreated значения соответствуют указанному вами формату, этот запрос должен работать.

Вот пример, который показывает, что ваш запрос работает должным образом в MySQL 5.6.14 с использованием 10 случайных дат, распределенных за последние 4 года:

Настроить:

mysql> create table submissions (
    -> id int not null auto_increment primary key,
    -> datecreated varchar(20)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into submissions (datecreated) select date_format(now() - interval (rand() * 31536000 * 4) second,'%d-%m-%Y %H:%i:%s');
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

Запрос:

mysql> SELECT * FROM submissions ORDER BY str_to_date(datecreated,'%d-%m-%Y %H:%i:%s') DESC;
+----+---------------------+
| id | datecreated         |
+----+---------------------+
|  3 | 16-11-2013 10:36:23 |
| 10 | 23-03-2013 23:04:52 |
|  4 | 02-08-2012 08:02:59 |
|  1 | 13-06-2012 21:52:34 |
|  7 | 02-10-2011 05:59:49 |
|  9 | 22-07-2011 14:04:19 |
|  2 | 04-07-2011 03:09:08 |
|  8 | 03-06-2011 03:55:04 |
|  6 | 06-01-2011 20:50:50 |
|  5 | 05-01-2011 20:54:16 |
+----+---------------------+
10 rows in set (0.00 sec)
Другие вопросы по тегам