Име на таблицата: DemoTable
.
Общо полета: 2
полета:
id (int, auto increment, primary key)
month_and_year (varchar(10))
month_and_year
съдържа дата като "2015-03", "2015-01", "2014-12" и така нататък ...
Опитвам се да получа стойности от таблицата между „2014-10“ и „2015-03“.
SELECT * FROM DemoTable where month_and_year>="2014-10" AND month_and_year<="2015-03" ORDER BY month_and_year DESC
Заявката не дава желания резултат като month_and_year
полето varchar
тип данни. Промяната на типа данни varchar на дата не е възможна, тъй като типът данни за датата не приема датата във формат "гггг-мм".
Как може да се получи резултатът?
PS: UNIX_TIMESTAMP () е безопасен залог в този случай?
Отговори:
3 за отговор № 1Никога не бива да съхранявате стойността на датата като varchar и да избирате типове данни за родните дати на mysql като date
,datetime
или timestamp
Въпреки това във вашия случай трябва да направите изчисления, свързани с датата, преди да направите избраната заявка. Помислете за следната таблица
mysql> select * from test ;
+------+----------------+
| id | month_and_year |
+------+----------------+
| 1 | 2014-10 |
| 2 | 2014-10 |
| 3 | 2014-09 |
| 4 | 2014-11 |
| 5 | 2015-01 |
| 6 | 2014-08 |
+------+----------------+
Сега подходът е както
Първо конвертирайте varchar в реална дата
Тогава за долната граница винаги започвате сравнението от първия ден на годината
Горната граница ще бъде до края на месеца.
Така че заявката става
select * from test
where
date_format(
str_to_date(
month_and_year,"%Y-%m"
),"%Y-%m-01"
)
>=
date_format(
str_to_date("2014-10","%Y-%m"
),"%Y-%m-01"
)
and
last_day(
date_format(
str_to_date(month_and_year,"%Y-%m"
),"%Y-%m-01"
)
)
<=
last_day(
date_format(
str_to_date("2015-03","%Y-%m"
),"%Y-%m-01"
)
);
Резултатът ще бъде както
+------+----------------+
| id | month_and_year |
+------+----------------+
| 1 | 2014-10 |
| 2 | 2014-10 |
| 4 | 2014-11 |
| 5 | 2015-01 |
+------+----------------+
0 за отговор № 2
Трябва да използвате MySQL дата функции или използвайте int поле в mysql и store UNIXTIMESTAMP
и сравни както вече правиш. Мисля, че е прекалено много да се съхранява unixtimestamp, защото трябва само месец и година и няма да спечелите много от предимствата на unixtimestamp.
0 за отговор № 3
Използвайте функцията STR_TO_DATE (низ, формат);
http://www.mysqltutorial.org/mysql-str_to_date/