3

以下のようなデータを含む Oracle テーブルがあります。

 1. ID           DATE 
 2. 12           02/11/2013
 3. 12           02/12/2013
 4. 13           02/11/2013
 5. 13           02/12/2013
 6. 13           02/13/2013
 7. 13           02/14/2013
 8. 14           02/11/2013
 9. 14           02/12/2013
10. 14           02/13/2013

月曜日、火曜日、水曜日の日付のみを持つ ID のみを検索する必要があるため、ここでは ID = 14 のみを返す必要があります。私は Oracle を使用しており、日付の形式は MM/DD/YYYY です。ご意見をお聞かせください。

よろしく、ニティン

4

3 に答える 3

4

日付列がDATEデータ型の場合、次のことができます

select id
from your_table
group by id
having sum(case 
           when to_char(date_col,'fmday') 
                in ('monday','tuesday','wednesday') then 1
           else 99
           end) = 3;

編集igrの観察で上記のコードを修正

ただし、これは、同じ ID に対して 1 日に 2 回ない場合にのみ問題ありません。

列がvarchar2の場合、条件は次のようになりますto_char(to_date(your_col,'mm/dd/yyyy'),'fmday') in ...

より堅牢なコードは次のようになります。

select id 
from(
    select id, date_col
    from your_table
    group by id, date_col
)
group by id
having sum(case 
           when to_char(date_col,'fmday', 'NLS_DATE_LANGUAGE=ENGLISH') 
                    in ('monday','tuesday','wednesday') then 1
           else 99
           end) = 3;
于 2013-02-20T06:42:12.960 に答える
1

のようなことをする

SELECT * FROM your_table t 
      where to_char(t.DATE, 'DY') in ('whatever_day_abbreviation_day_you_use');

または、次のような日付番号を使用することもできます。

SELECT * FROM your_table t 
     where  to_number(to_char(d.ts, 'D')) in (1,2,3);

ID の繰り返しを避けたい場合は、DISTINCTION を追加します

SELECT DISTINCT ID FROM your_table t 
     where  to_number(to_char(d.ts, 'D')) in (1,2,3);
于 2013-02-20T06:40:13.037 に答える
1
select id 
from (
  select 
     id, 
     sum (case when to_char(dt, 'D', 'nls_territory=AMERICA') between 1 and 3 then 1 else -1 end) AS cnt
  from t
  group by id
)
where cnt=3

注: (id,dt) は一意であると想定しました。同じ ID と日付を持つ 2 つの行はありません。

于 2013-02-20T06:58:44.290 に答える