テーブル名: 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/