Mysql: преобразование даты из «дд / мм / гггг» в «ггггммдд» - PullRequest
6 голосов
/ 07 сентября 2010

Я работаю над базой данных, которая хранит даты в поле varchar(10) mysql (очень печально).

Я не могу изменить структуру базы данных (я создаю небольшой плагин), но мне нужнозапросить в базе данных поиск строк, где это поле данных находится между следующими 10 днями.

Пример:

| fid | fdate      |
|  1  | 10/09/2010 |
|  2  | 17/09/2010 |
|  3  | 19/09/2010 |

Мне нужно получить строки с fid 1 и 2, потому что дата <= сейчас + 10 дней. </p>

Обычно я делаю такой запрос:

SELECT fid FROM table WHERE fdate <= DATE_ADD(NOW(), INTERVAL 10 DAY);

Или, если дата в формате `ггггммдд ':

SELECT fid FROM table WHERE fdate <= DATE_FORMAT(NOW(), '%Y%m%d');

Но они бесполезны с форматом dd/mm/yyyy.

Я понял с

SELECT fid, CONCAT(SUBSTRING(fdate, 7, 4), SUBSTRING(fdate, 4, 2), SUBSTRING(fdate, 1, 2)) AS mydate FROM table HAVING mydate <= DATE_ADD(NOW(), INTERVAL 10 DAY);

, но я думаю, что это немного излишне - перестраивать формат даты с помощью concat и подстроки,и предложение having не поможет скорости запроса.

Есть идеи?

EDIT

После комментария Адриано правильное решение -

SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY);

так что я могу избежать конкат и иметь пункт.

1 Ответ

7 голосов
/ 07 сентября 2010

Как насчет использования str_to_date () для создания даты из вашего формата?

РЕДАКТИРОВАТЬ после прочтения вашего комментария я создал таблицу, подобную вашей:

mysql> SELECT fid, fdate FROM test;
+------+------------+
| fid  | fdate      |
+------+------------+
|    1 | 10/9/2010  | 
|    2 | 17/9/2010  | 
|    3 | 19/09/2010 | 
+------+------------+

, а затем сделал

mysql> SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY);
+------+
| fid  |
+------+
|    1 | 
|    2 | 
+------+

Кажется, работает.Что именно вы получаете?

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