在不同年份中按日/月获得最早的日期

时间:2012-09-13 07:23:12

标签: sql oracle function date monthcalendar

我有一份日期清单:

活动日期

- 06/04/1998
- 12/08/1980
- 29/11/2010
- 16/06/2002
- 20/10/2007
- 10/07/2000

我想在这些年中按日/月获得最早的活动日期。所以最早的是06/04/1998,如果我想获得最新的活动日期,那就是29/11/2010。我该如何为此编写语法?

5 个答案:

答案 0 :(得分:2)

SELECT MAX(date), MIN(date), YEAR(date) year, MONTH(date) month
FROM table
GROUP BY YEAR(date), MONTH(date)

注意:这是伪代码 - 您需要查找oracle中正确的函数来从日期中提取年份和月份。

您还将受益于YEAR(date), MONTH(date), date

上的功能索引

答案 1 :(得分:2)

SELECT EXTRACT( MONTH FROM date_column),
       EXTRACT( DAY   FROM date_column),
       EXTRACT( YEAR  FROM date_column),
       date_column
  FROM table
 ORDER BY 1, 2, 3

并选择第一条记录

SELECT *
  FROM (SELECT EXTRACT( MONTH FROM date_column),
               EXTRACT( DAY   FROM date_column),
               EXTRACT( YEAR  FROM date_column),
               date_column
          FROM table
         ORDER BY 1, 2, 3)
 WHERE rownum <= 1

答案 2 :(得分:1)

假设我明白你确实想要在任何一年中按日/月的最早日期,那么analytic function可以做到这一点:

select dt from (
    select dt,
        dense_rank() over (partition by 1 order by to_char(dt, 'MMDD'),
            to_char(dt, 'YYYY')) rn
    from t
)
where rn = 1;

DT
----------
06/04/1998

内部select使用dense_rank()根据我指定的顺序为每个日期分配排名 - 还有其他方法可以执行此操作,但将日/月转换为字符串似乎工作,如果你有超过一年的同一天/月,我就把年份打破了关系(猜测你想要在这种情况下最早的一年)。就这一点而言,添加了一些额外的日期,看起来像这样:

alter session set nls_date_format = 'DD/MM/YYYY';
with t as (
    select to_date('06/04/1998') as dt from dual
    union all select to_date('12/08/1980') from dual
    union all select to_date('29/11/2010') from dual
    union all select to_date('16/06/2002') from dual
    union all select to_date('20/10/2007') from dual
    union all select to_date('10/07/2000') from dual
    union all select to_date('10/07/1999') from dual
    union all select to_date('06/04/1999') from dual
)
select dt,
    dense_rank() over (partition by 1 order by to_char(dt, 'MMDD'),
        to_char(dt, 'YYYY')) rn
from t;

DT         RN
---------- ----------
06/04/1998      1
06/04/1999      2
16/06/2002      3
10/07/1999      4
10/07/2000      5
12/08/1980      6
20/10/2007      7
29/11/2010      8

8 rows selected.

外部选择只会选择等级为dt的{​​{1}}值。

如果您想查找最新内容,请更改rn = 1条款以包含order by,以便按相反的顺序排序。

答案 3 :(得分:0)

如何关注:

从...中选择日期,其中rownum = 1个月(日期)* 100 +日(日期)desc

从...中选择日期,其中rownum = 1个按月(日期)* 100 +日(日期)asc

答案 4 :(得分:0)

如果该列表已在表格中。

Just SELECT Max(fieldName)或Min(fieldName)