我有一个日期列表:
活动日期
- 06/04/1998
- 12/08/1980
- 29/11/2010
- 16/06/2002
- 20/10/2007
- 10/07/2000
我想按天/月获得这些年来最早的事件日期。所以最早的是 06/04/1998,如果我想获得最新的活动日期,它是 29/11/2010。我如何为此编写语法?
我有一个日期列表:
活动日期
- 06/04/1998
- 12/08/1980
- 29/11/2010
- 16/06/2002
- 20/10/2007
- 10/07/2000
我想按天/月获得这些年来最早的事件日期。所以最早的是 06/04/1998,如果我想获得最新的活动日期,它是 29/11/2010。我如何为此编写语法?
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
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
假设我了解您确实想要任何一年中按日/月计算的最早日期,那么分析函数可以做到这一点:
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
具有 rank 的值rn = 1
。
如果您想查找最新的,请将order by
子句更改为包含desc
,以便它们以相反的顺序排序。
以下怎么样:
从...中选择日期,其中 rownum = 1 按月(日期)* 100 + 日(日期)顺序排列
从...中选择日期,其中 rownum = 1 order by month(date) * 100 + day(date) asc
如果该列表已经在表中。
只需选择 Max(fieldName) 或 Min(fieldName)