1

開始日と終了日をタイムスタンプとして含むレコードを持つ MySQL テーブルがあります。

ID(整数) | dtBeg(タイムスタンプ) | dtEnd(タイムスタンプ)

時間範囲内の特定の月を持つレコードを選択しようとします。

例えば:

ID(整数) | dtBeg(タイムスタンプ) | dtEnd(タイムスタンプ)

1 | '2013-06-20' | '2013-08-20'

2 | '2013-07-20' | '2013-09-20'

2 | '2013-07-25' | '2013-07-28'

6月の記録: 1

7 月に発生したレコード: 1、2、3

8月の記録: 1, 2

9月の記録: 2

現在、日付範囲を処理するための適切なアプローチが何であるかがわからないため、月を抽出できました。私の頭に浮かぶ唯一の解決策は複雑な方法であり、それを行うための簡単でスマートな方法があると確信しています.

4

1 に答える 1

2

このような比較では、日時を「ゼロからの月数」に変換するのが好きです。あなた、算数だけで計算できるってこと。

クエリの場合、これは次のようになります。

select t.*, year(compdate), month(compdate)
from t cross join
     (select date('2013-07-01') as compdate) const
where year(compdate)*12+month(compdate) between year(dtBeg)*12 + month(dtBeg) and
                                                year(dtEnd)*12 + month(dtEnd);

compdateここでは、サブクエリに入れました。そうすれば、複数の月をチェックしたい場合は、テーブルに行を追加するだけです:

select t.*, year(compdate), month(compdate)
from t cross join
     (select date('2013-07-01') as compdate union all
      select date('2013-08-01')
     ) const
where year(compdate)*12+month(compdate) between year(dtBeg)*12 + month(dtBeg) and
                                                year(dtEnd)*12 + month(dtEnd);

この形式は、多くの SQL ダイアレクトで機能します。を使用して、MySQL 固有の関数で同様のことを行うことができますdate_format()

select t.*, year(compdate), month(compdate)
from t cross join
     (select '2013-07' as compdate union all
      select '2013-08'
     ) const
where compdate between date_format(dtBeg, '%Y-%m') and date_format(dtEnd, '%Y-%m)
于 2013-07-21T12:15:48.207 に答える