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 № 1Nigdy 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/