web-dev-qa-db-ja.com

mysqlで日付から月を取得するにはどうすればよいですか

次のようなステートメントでmysqlから結果を取得できるようにしたいと思います。

SELECT * 
  FROM table 
 WHERE amount > 1000 

しかし、特定の月と年に制限された結果を取得したい(ユーザーからの入力に基づいて)...私はこのようにしていました:

SELECT * 
  FROM table 
 WHERE amount > 1000 
   AND dateStart = MONTH('$m')   

...$mは1か月ですが、エラーが発生しました。

そのテーブルでは、実際にはstartDateendDateの2つの日付がありますが、startDateに焦点を合わせています。入力値は月と年になります。その年のその月に基づいて結果を取得するSQLステートメントを表現するにはどうすればよいですか?

23
netrox

あなたは近かった-後方比較を得た(startDateがDATETIMEまたはTIMESTAMPデータ型であると仮定):

SELECT * 
  FROM table 
 WHERE amount > 1000 
   AND MONTH(dateStart) = {$m}

警告:


  • mysql_escape_string を使用している、または SQLインジェクション攻撃 のリスクがあることに注意してください。
  • 列に対する関数呼び出しは、インデックスが存在する場合、それを使用できないことを意味します

代替案:


列で関数を使用するとインデックスを使用できないため、より良いアプローチはBETWEENおよびSTR_TO_DATE関数を使用することです。

WHERE startdate BETWEEN STR_TO_DATE([start_date], [format]) 
                    AND STR_TO_DATE([end_date], [format])

書式の構文については、ドキュメントを参照してください。

参照:


39
OMG Ponies

month()関数を使用します。

select month(now());
7
Gattster

例えば。

_$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は用語を一度だけ計算し、検索にインデックスを利用できます。

3
VolkerK

これを試して:

SELECT * 
FROM table 
WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m')
3
Louis

対象: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");
    
0
Mr.DIpak SOnar

これを試してください(日付フィールドはテキストで、この文字列を日付に変換します):

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
0
A.Aleem11

これを試して

SELECT * 
      FROM table 
     WHERE amount > 1000 
       AND MONTH(datestart)
    GROUP BY EXTRACT(YEAR_MONTH FROM datestart)
0
Choxmi