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 时才可以。

如果列是 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 和日期。

于 2013-02-20T06:58:44.290 回答