テーブル内の日付は、次の形式の文字列です。
"10/12/2009"
では、1か月のすべてのレコードをどのように取得するのでしょうか。たとえば、6月(番号「6」が提供されている)としましょう。
テーブル内の日付は、次の形式の文字列です。
"10/12/2009"
では、1か月のすべてのレコードをどのように取得するのでしょうか。たとえば、6月(番号「6」が提供されている)としましょう。
MySQL関数STR_TO_DATEを確認してください。
ただし、日付を文字列として保存しないでください。タイプDATEを使用します。
質問に対する簡単な答えは、STR_TO_DATE
andMONTH
関数を使用して、1)文字列表現をDATEに変換し、2)日付から月コンポーネントを抽出できることです。
SELECT t.*
FROM mytable t
WHERE MONTH(STR_TO_DATE(t.dateasstringcol,'%M/%d/%Y')) = 6
(これは、「2009年10月12日」までに、12月10日ではなく10月12日を指定していることを前提としています。そうでない場合は、フォーマット文字列を調整する必要があります。)
または、月が実際に日付の先頭部分である場合、月が先頭コンポーネントである場合は、単純な文字列比較を行うことができます。
SELECT t.*
FROM mytable t
WHERE t.dateasstringcol LIKE '6/%'
OR t.dateasstringcol LIKE '06/%'
(日付を表す行の値に正確な形式が指定されている場合は、これらの述語の1つを削除できます。月が常に2桁で格納される場合、または月が先行ゼロで格納されることはありません。)
その月の引数(たとえば「6」)を渡す場合は、次のようにステートメントを作成できます。
WHERE t.dateasstringcol LIKE '6' + '/%'
月が日付の2番目のコンポーネントである場合は、次を使用できます。
SELECT t.*
FROM mytable t
WHERE t.dateasstringcol LIKE '%/' + '6' + '/%'
OR t.dateasstringcol LIKE '%/' + '06' + /%'
ノート:
前の例のクエリはすべて、任意の年(2009、2010、2011)の6月の行を返します。
これらの例を拡張して、MONTH関数の代わりにYEAR関数を使用するか、文字列の比較のために、年と同様のことを行うことができます。
AND t.dateasstringcol LIKE '%/%/2011'
通常、次のような日付範囲を使用して、特定の年の特定の月の行を抽出します。
SELECT t.*
FROM mytable t
WHERE MONTH(STR_TO_DATE(t.dateasstring,'%M/%d/%Y')) >= '2011-06-01'
AND MONTH(STR_TO_DATE(t.dateasstring,'%M/%d/%Y')) < '2011-07-01'
もちろん、日付値がDATE
VARCHARではなくデータ型として格納されている場合、これはSTR_TO_DATE関数とMONTH関数が不要であることを意味し、ネイティブのDATE列との比較を指定できます。このアプローチにより、日付列のインデックスを利用できるようになり、大きなテーブルでのクエリのパフォーマンスを向上させることができます。
SELECT t.*
FROM mytable t
WHERE t.realdatecol >= '2011-06-01'
AND t.realdatecol < '2011-07-01'
STR_TO_DATE関数はここであなたの友達です:
SELECT * FROM my_table
WHERE STR_TO_DATE('10/12/2009','%M/%d/%Y') >= '2012-06-01';
今月または特定の月のデータが必要な場合は、MONTHがここで役立ちます。例えば:
$month = date('m'); OR particular month.
SELECT * FROM users WHERE MONTH(str_to_date("10/12/2009",'%e/%m/%Y')) = $month;