2

年と月の特定の範囲の行を選択しようとしています。(つまり: from <start year>+<start month>to <end year>+<end month>) 以下のクエリを試しましたが、予期しない行が表示されます。何か不足していますか?

SELECT * FROM table AS t
WHERE 
((YEAR(t.column1)='<start year>' AND MONTH(t.column1)>='<start month>') OR
(YEAR(t.column1)>'<start year>' AND YEAR(t.column1)<'<end year>') OR
(YEAR(t.column1)='<end year>' AND MONTH(t.column1)<='<end month>'))
4

3 に答える 3

5

クエリは、開始年と終了年が異なる場合にのみ正しく機能します。それらが同じである場合、クエリはその年のすべての行を返します。このケースは個別に処理する必要があります。

(
    start_year != end_year and 
    (
        (YEAR(t.column1)='<start year>' AND MONTH(t.column1)>='<start month>') OR  
        (YEAR(t.column1)>'<start year>' AND YEAR(t.column1)<'<end year>') OR  
        (YEAR(t.column1)='<end year>' AND MONTH(t.column1)<='<end month>')
    )
)
OR (start_year = end_year and MONTH(t.column1) >= start_month
                          and MONTH(t.column1) <= end_month)

ただし、これは非常に単純化できます。

YEAR(t.column1) * 12 + MONTH(t.column1) >= start_year * 12 + start_month
and YEAR(t.column1) * 12 + MONTH(t.column1) <= end_year * 12 + end_month

またはさらに短くbetween

YEAR(t.column1) * 12 + MONTH(t.column1)
BETWEEN start_year * 12 + start_month and end_year * 12 + end_month
于 2012-08-29T06:36:17.860 に答える
1

これを試して:

... WHERE t.column1>="startYear-startMonth-01" AND t.column1<="endYear-endMonth-31"
于 2012-08-29T06:32:38.907 に答える
1

次のようなことを試すことができます:

SELECT * FROM table AS t
WHERE  t.column1
       BETWEEN STR_TO_DATE(CONCAT('<start year>', '<start month>', '01'), '%Y%m%d') AND 
               LAST_DAY(STR_TO_DATE(CONCAT('<start end>', '<start end>','01'), '%Y%m%d'));

column の index を使用するため、これはパフォーマンスが向上するはずcolumn1です。

于 2012-08-29T06:34:40.493 に答える