/ / MySQL文の日付を含むwhere節が機能しない - mysql、date

MySQL文の日付を含むwhere節が動作しない - mysql、date

テーブル名: 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 データ・タイプ。日付データ型が "yyyy-mm"形式の日付を受け入れないため、varcharからdateデータ型を変更することはできません。

どのように結果を得ることができますか?

PS:この場合、UNIX_TIMESTAMP()は安全な賭けですか?

回答:

回答№1の場合は3

あなたは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        |
+------+----------------+

回答№2の場合は0

mysqlの日付時刻 機能 mysqlとストアのintフィールドを使用する UNIXTIMESTAMP あなたがすでにやっているように比較してください。私はunixtimestampを保存するのは残念だと思うのです。なぜなら、月と年だけが必要で、unixtimestampの利点から多くの利益を得ることができないからです。


回答№3の場合は0

関数STR_TO_DATE(文字列、書式)を使用します。

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