我有一个包含如下数据的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。 请指教。
此致 尼丁
答案 0 :(得分: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;
答案 1 :(得分: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);
答案 2 :(得分: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和日期。