Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 只查找两个日期之间的特定日期_Oracle_Date_Date Math - Fatal编程技术网

Oracle 只查找两个日期之间的特定日期

Oracle 只查找两个日期之间的特定日期,oracle,date,date-math,Oracle,Date,Date Math,我有一个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

我有一个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。 请给我一些建议

问候,, 尼汀做一些类似的事情

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,请添加区分

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

如果日期列是日期数据类型,则可以

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(您的_col,'mm/dd/yyyy'),'fmday'),在…

更稳健的代码是:

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;

注意:我假设(id,dt)是唯一的-没有两行具有相同的id和日期。

您的日期是真实日期(按数据类型)或者它们是格式为MM/DD/YYYY的字符串?在处理SQL时,如果您给我们一些代码来创建您正在使用的表,而不是ASCII表转储,通常会有所帮助。此解决方案是否取决于您正在使用的语言设置?这并不重要,也不是用户的问题。他只想知道如何选择具有该属性的ID。不幸的是,系统之间的设置会有所不同。因此,如果有一个解决方案不依赖于这些设置,请使用它。始终如此。您的示例不会消除id=13@FlorinGhita您需要将掩码添加为
fmday
而不是
day
,否则周一/周二可能会被填充为空白,因此永远不会与in子句匹配,或者只需将
dy
mon
tue
等一起使用。它们还将返回id:12,13您的情况是什么"... 只有星期一、星期二和星期三的日期"; 2/11和2/12是星期一和星期二…是操作条件,不是我的。再读一遍他的要求。他想要三天的身份证,而且只有三天。不仅仅是两天,也不是第二天。而且,D的值取决于NLS_区域设置。在许多地方,1不是星期一,而是星期天或星期六。只要星期一是一周的第一天,就可以了。这取决于nls\U区域。@igr,您还需要在内部选择中添加一个
groupby-id
,谢谢这两个建议-我做了一个更改。
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