34

DATE_ADDMySQLの機能に問題があります。

私のリクエストは次のようになります:

SELECT * 
FROM mydb 
WHERE creationdate BETWEEN "2011-01-01" AND DATE_ADD("2011-01-01", INTERVAL 6 MONTH) 
GROUP BY MONTH(creationdate)

問題は、結果では、6月は30日しかないため、 7月1日の結果と同じように、関数が正しく機能しないことです。

DATE_ADDうまく機能し、1か月以内に適切な日数を取るように指示する方法はありますか?

4

5 に答える 5

66

DATE_ADDさまざまな月で問題なく動作します。問題は、6か月を追加していて2001-01-01、7月1日がそこにあるはずであるということです。

これはあなたがしたいことです:

SELECT * 
FROM mydb 
WHERE creationdate BETWEEN "2011-01-01" 
                   AND DATE_ADD("2011-01-01", INTERVAL 6 MONTH) - INTERVAL 1 DAY
GROUP BY MONTH(creationdate)

また

SELECT * 
FROM mydb 
WHERE creationdate >= "2011-01-01" 
AND creationdate < DATE_ADD("2011-01-01", INTERVAL 6 MONTH)
GROUP BY MONTH(creationdate)

詳細については、DATE_ADDのドキュメントを参照してください。

*構文を修正するために編集

于 2011-07-27T14:03:46.540 に答える
6

まあ、私にとってこれは期待される結果です。1月1日7月に6か月を追加します。

mysql> SELECT DATE_ADD( '2011-01-01', INTERVAL 6 month );
+--------------------------------------------+
| DATE_ADD( '2011-01-01', INTERVAL 6 month ) |
+--------------------------------------------+
| 2011-07-01                                 | 
+--------------------------------------------+
于 2011-07-27T14:03:04.163 に答える
1

BETWEEN ... AND

exprがmin以上で、exprがmax以下の場合、BETWEEN1を返し、それ以外の場合は0を返します。

ここで重要なのは、7月1日である最大値と同等です。

于 2011-07-27T14:02:19.520 に答える
1

DATE_ADD("2011-01-01", INTERVAL 6 MONTH)「2011-07-01」ではなく「2011-06-30」が表示されると思いますか?もちろん、2011-01-01+6か月は2011-07-01です。あなたはのようなものが欲しいですDATE_SUB(DATE_ADD("2011-01-01", INTERVAL 6 MONTH), INTERVAL 1 DAY)

于 2011-07-27T14:06:28.777 に答える
0

DATE_ADD正しく動作します。1月1日プラス6か月は7月1日であり、1月1日プラス1か月は2月1日です。

操作間は包括的です。つまり、7月1日までのすべてを取得しています。(MySQLの「between」句も含まれていませんか?

あなたがする必要があるのは、1日を引くか、間ではなく<演算子を使用することです。

于 2011-07-27T14:04:33.220 に答える