0

私は一般的にSQLとプログラミングにかなり慣れていないので、これの構文がわかりません。テーブルがあり、特定の学期中に発生するすべての行を選択したいと考えています。ターンオーバーは 1 月 1 日と 7 月 1 日です。今月に応じて、今年、7 月より前、または 7 月以降のすべてのエントリを表示したいと考えています。私の日付列はSQL日付形式です。

4

2 に答える 2

1

Oracle を使用している場合は、where 句で case ステートメントを使用でき、Oracle の日付に明示的に年を設定しない場合、現在の年が想定されるという事実を利用できます。

select *
  from your_table
 where case
         when trunc(sysdate) > to_date('01-JUL', 'DD-MON') then
           to_date('01-JUL', 'DD-MON')
         else
           to_date('01-JAN', 'DD-MON')
       end < date_column;

現在の日付が 7 月 1 日より後の場合、最初の学期の結果が得られないように使用することはあなたに任せます。1 つのアプローチは、同様の case ステートメントを使用することですが、よりクリーンな方法があると思います。

于 2013-07-20T19:51:07.350 に答える
0

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

SELECT * 
  FROM Table1
 WHERE date BETWEEN CASE WHEN CURDATE() < DATE_FORMAT(CURDATE(), '%Y-08-01') 
                         THEN DATE_FORMAT(CURDATE(), '%Y-01-01')
                         ELSE DATE_FORMAT(CURDATE(), '%Y-08-01') END
                AND CASE WHEN CURDATE() < DATE_FORMAT(CURDATE(), '%Y-08-01') 
                         THEN LAST_DAY(DATE_FORMAT(CURDATE(), '%Y-07-01'))
                         ELSE DATE_FORMAT(CURDATE(), '%Y-12-31') END

のように書き換えることもできます。

SELECT * 
  FROM Table1 CROSS JOIN
(
  SELECT CASE WHEN CURDATE() < DATE_FORMAT(CURDATE(), '%Y-08-01') 
              THEN DATE_FORMAT(CURDATE(), '%Y-01-01')
              ELSE DATE_FORMAT(CURDATE(), '%Y-08-01') END start_date,
         CASE WHEN CURDATE() < DATE_FORMAT(CURDATE(), '%Y-08-01') 
              THEN LAST_DAY(DATE_FORMAT(CURDATE(), '%Y-07-01'))
              ELSE DATE_FORMAT(CURDATE(), '%Y-12-31') END end_date
) q
 WHERE date BETWEEN q.start_date AND q.end_date

SQLFiddleデモ (MySql)は次のとおりです。

于 2013-07-20T19:53:25.370 に答える