Сравнение даты mysql с date_format
Я googled и попробовал несколько способов сравнить дату, но, к сожалению, не получил результат, как ожидалось. Я имею текущее состояние записей, например следующее:
mysql> select date_format(date(starttime),'%d-%m-%Y') from data;
+-----------------------------------------+
| date_format(date(starttime),'%d-%m-%Y') |
+-----------------------------------------+
| 28-10-2012 |
| 02-11-2012 |
| 02-11-2012 |
| 02-11-2012 |
| 03-11-2012 |
| 03-11-2012 |
| 07-11-2012 |
| 07-11-2012 |
Я хотел бы сравнить дату и, соответственно, сделать так:
mysql> select date_format(date(starttime),'%d-%m-%Y') from data where date_format(date(starttime),'%d-%m-%y') >= '02-11-2012';
+-----------------------------------------+
| date_format(date(starttime),'%d-%m-%Y') |
+-----------------------------------------+
| 28-10-2012 |
| 02-11-2012 |
| 02-11-2012 |
| 02-11-2012 |
| 03-11-2012 |
| 03-11-2012 |
| 07-11-2012 |
| 07-11-2012 |
Я считаю, что результат не должен включать "28 -10-2012". Любое предложение? Спасибо заранее.
Ответы
Ответ 1
Ваш формат в основном не сортируемый для начала - вы сравниваете строки, а строка "28-10-2012" больше, чем "02-11-2012".
Вместо этого вы должны сравнивать даты как даты, а затем только преобразовывать их в свой целевой формат для вывода.
Попробуйте следующее:
select date_format(date(starttime),'%d-%m-%Y') from data
where date(starttime) >= date '2012-11-02';
(Вход всегда должен быть в форме year-month-value, согласно документации.)
Обратите внимание, что если starttime
- это поле DATETIME
, вы можете захотеть изменить запрос, чтобы избежать повторного преобразования. (Оптимизатор может быть достаточно умным, чтобы этого избежать, но стоит проверить.)
select date_format(date(starttime),'%d-%m-%Y') from data
where starttime >= '2012-11-02 00:00:00';
(Обратите внимание, что для начала форматировать дату как d-m-Y
было бы лучше использовать y-M-d
в целом, являясь стандартом ISO-8601 и т.д. Однако приведенный выше код делает то, что вы просили в вопросе.)
Ответ 2
Используйте 2012-11-02 вместо 02-11-2012, и вам больше не понадобится date_format()
Ответ 3
Используйте следующий метод:
public function dateDiff ($date1, $date2) {
/* Return the number of days between the two dates: */
return round(abs(strtotime($date1)-strtotime($date2))/86400);
}
/* end function dateDiff */
Это поможет!