2017-01-10 12 views
-4

カバーしていた場合、私は基本的なテーブルがあります。日付範囲が全体の特定の月

ID datefrom dateto 
555 09-AUG-16 19-AUG-16 
400 16-MAY-16 04-OCT-16 
555 04-APR-16 29-JUL-16 

を、私は特定の月ピックアップしたい(年問題ではないが)月6

とのために言います私は次の出力を持ちたいというときの月= 6:

ID datefrom dateto fullmonth 
555 09-AUG-16 19-AUG-16 0 
400 16-MAY-16 04-OCT-16 1 
555 04-APR-16 29-JUL-16 1 

範囲は、6月の完全な月が含まれているとして、彼らは1の値を取得します(6)。

+0

ロジックは – Rahul

+0

@Rahul IVEはもう少しを追加しましたけれども、まだ明確ではありません。 – Matt

+1

あなたの 'datefrom'と' dateto'はvarcharと思われます。もしそうなら、それをしないでください! –

答えて

2

chosen_monthバインド・パラメータとしてヶ月以内に渡すと、日付値、そして(それ以外TO_DATE()を使用)datefromと仮定するとdatetoDATEデータ型を持っている、あなたが使用することができます与えられた年渡し、

SELECT t.*, 
     CASE WHEN datefrom <= TRUNC(:chosen_month, 'MM') 
      AND dateto >= ADD_MONTHS(TRUNC(:chosen_month, 'MM'), 1) 
      THEN 1 
      ELSE 0 
     END AS fullmonth 
FROM table_name t 

するか、とあなたは、行の今年

のためにそれを検討したい場合は、

WITH chosen_date (dt) AS (
    SELECT TO_DATE(
      TO_CHAR(:chosen_year, '0000') 
      || TO_CHAR(:chosen_month, '00') 
      || '01', 
      'YYYYMMDD' 
     ) 
    FROM DUAL 
) 
SELECT t.*, 
     CASE WHEN datefrom <= c.dt 
      AND dateto >= ADD_MONTHS(c.dt, 1) 
      THEN 1 
      ELSE 0 
     END AS fullmonth 
FROM table_name t 
     CROSS JOIN 
     chosen_date c 

または:月、その後、数字など

SELECT t.*, 
     CASE WHEN datefrom <= month_start 
      AND dateto >= ADD_MONTHS(month_start, 1) 
      THEN 1 
      ELSE 0 
     END AS fullmonth 
FROM (
    SELECT t.*, 
     ADD_MONTHS(TRUNC(datefrom, 'Y'), :chosen_month - 1) AS month_start 
    FROM table_name t 
) t 

注:from=2016-02-01, to=2016-02-29を月全体に適用すると考えると、ADD_MONTHS関数をLAST_DAYに置き換えてください。

+0

ORA-00932:矛盾したデータ型:期待された日付は月が選択されたときに – Matt

+0

になりました。私は一桁または二桁の数字を入れたいと思います。 6または12など – Matt

+0

'6'は1年のある月のインデックスですが、' 6'はそれ自身の月ではありません。月を指定する場合は、月と年を指定する必要があります(または、その月の日付を使用します)。それ以外の場合は、** any year **に満月になるように要件を変更します。これはまったく異なる質問です。 – MT0

0

私はCASE文でLAST_DAY機能を使っとともに、(ODBC経由でExcelファイルに落としたときにパラメータ化されます)月を生成するTO_DATE機能を使用していました。

SELECT ID, datefrom, dateto, 
CASE WHEN datefrom <= TO_DATE('6/2016', 'MM/YYYY') 
      AND dateto >= LAST_DAY(TO_DATE('6/2016', 'MM/YYYY')) 
      THEN 1 
      ELSE 0 
     END AS fullmonth 
FROM mytable 

出力:

ID datefrom dateto fullmonth 
555 09-AUG-16 19-AUG-16 0 
400 16-MAY-16 04-OCT-16 1 
555 04-APR-16 29-JUL-16 1 
+0

これは私の答えの一部の複製です。 – MT0

+0

私の答えをあなたのものにコピーして貼り付けてください。 – Matt

関連する問題