次のようなステートメントでmysqlから結果を取得できるようにしたいと思います。
SELECT *
FROM table
WHERE amount > 1000
しかし、特定の月と年に制限された結果を取得したい(ユーザーからの入力に基づいて)...私はこのようにしていました:
SELECT *
FROM table
WHERE amount > 1000
AND dateStart = MONTH('$m')
...$m
は1か月ですが、エラーが発生しました。
そのテーブルでは、実際にはstartDate
とendDate
の2つの日付がありますが、startDate
に焦点を合わせています。入力値は月と年になります。その年のその月に基づいて結果を取得するSQLステートメントを表現するにはどうすればよいですか?
あなたは近かった-後方比較を得た(startDate
がDATETIMEまたはTIMESTAMPデータ型であると仮定):
SELECT *
FROM table
WHERE amount > 1000
AND MONTH(dateStart) = {$m}
列で関数を使用するとインデックスを使用できないため、より良いアプローチはBETWEEN
およびSTR_TO_DATE
関数を使用することです。
WHERE startdate BETWEEN STR_TO_DATE([start_date], [format])
AND STR_TO_DATE([end_date], [format])
書式の構文については、ドキュメントを参照してください。
month()
関数を使用します。
select month(now());
例えば。
_$date = sprintf("'%04d-%02d-01'", $year, $month);
$query = "
SELECT
x,y,dateStart
FROM
tablename
WHERE
AND amount > 1000
AND dateStart >= $date
AND dateStart < $date+Interval 1 month
";
mysql_query($query, ...
_
これにより、次のようなクエリが作成されます。
_WHERE
AND amount > 1000
AND dateStart >= '2010-01-01'
AND dateStart < '2010-01-01'+Interval 1 month
_
_+ Interval 1 month
_は、 date_add() の代替です。
SELECT Date('2010-01-01'+Interval 1 month)
-> _2010-02-01
_SELECT Date('2010-12-01'+Interval 1 month)
-> _2011-01-01
_
これにより、常に翌月の初日を取得できます。必要なレコードには、その日付より前で、sprintf()に渡した月(および年)の最初の日以降のdateStartが必要です。
_'2010-01-01'+Interval 1 month
_は行間で変わりません。 MySQLは用語を一度だけ計算し、検索にインデックスを利用できます。
これを試して:
SELECT *
FROM table
WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m')
対象:MySQL 5.7、MySQL 5.6、MySQL 5.5、MySQL 5.1、MySQL 5.0、MySQL 4.1、MySQL 4.0、MySQL 3.23
日:
SELECT EXTRACT(DAY FROM "2017-06-15");
月:
SELECT EXTRACT(MONTH FROM "2017-06-15");
年:
SELECT EXTRACT(YEAR FROM "2017-06-15");
これを試してください(日付フィールドはテキストで、この文字列を日付に変換します):
SELECT * FROM `table_name` WHERE MONTH(STR_TO_DATE(date,'%d/%m/%Y'))='11'
//This will give month number MONTH(STR_TO_DATE(date,'%d/%m/%Y'))
//If its return 11 then its November
// Change date format with your date string format %d/%m/%Y
これを試して
SELECT *
FROM table
WHERE amount > 1000
AND MONTH(datestart)
GROUP BY EXTRACT(YEAR_MONTH FROM datestart)