web-dev-qa-db-ja.com

MySQL-DATE_ADD月間隔

MySQLのDATE_ADD関数に問題があります。

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

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

問題は、結果では、Juneが30日間しかないため、Julyの最初の結果があるため、関数が正しく機能しないことです。 =。

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

29
Nugget

DATE_ADDは、異なる月でも問題なく動作します。問題は、2001-01-01に6か月を追加し、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)

OR

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

さらに学習するには、 DATE_ADD documentation をご覧ください。

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

57
Adrian Carneiro

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

mysql> SELECT DATE_ADD( '2011-01-01', INTERVAL 6 month );
+--------------------------------------------+
| DATE_ADD( '2011-01-01', INTERVAL 6 month ) |
+--------------------------------------------+
| 2011-07-01                                 | 
+--------------------------------------------+
2
wonk0

BETWEEN ... AND

Exprがmin以上でexprがmax以下である場合、BETWEENは1を返し、それ以外の場合は0を返します。

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

1
Jacob

DATE_ADDは正常に機能します。 1月1日+ 6か月は7月1日です。1月1日+ 1か月は2月1日です。

操作間は包括的です。したがって、7月1日までにすべてを取得しています。 ( MySQL "between"句は含まれない? も参照)

必要なことは、1日を減算するか、間にではなく<演算子を使用することです。

0
yu_sha

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)のようなものが必要です。

0
sw0x2A