/ / Gdzie klauzula zawierająca datę w instrukcji MySQL nie działa - mysql, data

Gdzie klauzula zawierająca datę w instrukcji MySQL nie działa - mysql, date

Nazwa tabeli: DemoTable.

Suma pól: 2

Pola:

id (int, auto increment, primary key)
month_and_year (varchar(10))

month_and_year zawiera datę „2015-03”, „2015-01”, „2014-12” i tak dalej ...

Próbuję uzyskać wartości z tabeli między „2014-10” a „2015-03”.

SELECT * FROM DemoTable where month_and_year>="2014-10" AND month_and_year<="2015-03" ORDER BY month_and_year DESC

Zapytanie nie daje pożądanego wyniku jako month_and_year pole ma varchar typ danych. Zmiana typu danych varchar na datę nie jest możliwa, ponieważ typ danych data nie akceptuje daty w formacie „rrrr-mm”.

Jak można uzyskać wynik?

PS: Czy UNIX_TIMESTAMP () jest bezpiecznym zakładem w tym przypadku?

Odpowiedzi:

3 dla odpowiedzi № 1

Nigdy nie należy przechowywać wartości daty jako varchar i wybierać typy danych związane z natywną datą mysql, takie jak date,datetime lub timestamp

Jednak w twoim przypadku musisz wykonać obliczenia związane z datą przed wykonaniem wybranego zapytania. Rozważ następującą tabelę

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        |
+------+----------------+

Teraz podejście byłoby tak

Najpierw przekonwertuj varchar na prawdziwą datę

Następnie dla dolnego limitu zawsze rozpocznij porównanie od pierwszego dnia wartości miesiąca miesiąca

Górny limit będzie obowiązywał do końca miesiąca.

Zatem zapytanie staje się

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"
)
);

Wyjście będzie jak

+------+----------------+
| id   | month_and_year |
+------+----------------+
|    1 | 2014-10        |
|    2 | 2014-10        |
|    4 | 2014-11        |
|    5 | 2015-01        |
+------+----------------+

0 dla odpowiedzi nr 2

Należy użyć daty i godziny mysql Funkcje lub użyj pola int w mysql i store UNIXTIMESTAMP i porównaj jak już robisz. Myślę, że przechowywanie unixtimestamp jest przesadą, ponieważ potrzebujesz tylko miesiąca i roku, a korzyści wynikające z unixtimestamp nie będą zbyt duże.


0 dla odpowiedzi № 3

Użyj funkcji STR_TO_DATE (ciąg, format);

http://www.mysqltutorial.org/mysql-str_to_date/