2013-02-20 72 views
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。 请指教。

问候, 尼廷

+1

你是日期实际日期(按数据类型)还是他们的字符串格式为MM/DD/YYYY? – Viehzeug 2013-02-20 06:30:09

+0

当处理SQL时,如果你给我们一些代码来创建你正在使用的表而不是ASCII表转储,它通常会有所帮助。 – Joey 2013-02-20 08:10:56

回答

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); 
+0

这些将返回也ID:12,13 – 2013-02-20 06:46:10

+0

您的条件是“......只有星期一,星期二和星期三日期”;井2/11和2/12是周一和周二...... – i100 2013-02-20 07:07:25

+1

是OP条件,不是我的。再次阅读他的要求。他想要那些三天只有三天的ID。不只是两个,而是不同的一天。 – 2013-02-20 07:16:08

4

如果日期栏是日期数据类型,那么你可以

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; 

编辑Corected在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; 
+0

此解决方案不会取决于您正在使用的语言设置吗? – Rene 2013-02-20 06:46:07

+0

这不重要,也不是用户的问题。他只想知道如何选择具有该属性的ID。 – 2013-02-20 06:48:25

+0

不幸的是,系统之间的设置会有所不同。因此,如果有一个解决方案不依赖于这些设置,请使用该解决方案。总是。 – Rene 2013-02-20 06:54:20

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和日期。

+3

星期一是星期几的第一天。这取决于nls_territory。 – 2013-02-20 07:22:07

+2

@igr,你还需要在内部选择 – 2013-02-20 07:43:15

+0

“由ID编组”。感谢这两个建议 - 我做了一个改变。 – igr 2013-02-20 08:54:38