我有一份日期清单:
活动日期
- 06/04/1998
- 12/08/1980
- 29/11/2010
- 16/06/2002
- 20/10/2007
- 10/07/2000
我想在这些年中按日/月获得最早的活动日期。所以最早的是06/04/1998,如果我想获得最新的活动日期,那就是29/11/2010。我该如何为此编写语法?
答案 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)