/ / Къде клауза, съдържаща дата в MySQL оператор не работи - mysql, date

Където клаузата, съдържаща дата в израза MySQL, не работи - mysql, дата

Име на таблицата: 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/