2

大家好,我正在尝试获取一年中所有月份的 Ist 日期,例如 Curretn 年份是 2012 年,我想从查询中获得以下结果

1-JAN-2012
1-FEB-2012
1-APR-2012
.
.
.
.
.
.
1-DEC-2012

有没有人可以解决我的问题提前谢谢

4

4 回答 4

5

只是为了完整性 - 这是一个更简单的版本:

select ADD_MONTHS(TRUNC(SYSDATE,'Y'),ROWNUM-1)
from dual connect by level <= 12;
于 2012-06-25T02:47:43.057 回答
3

日历表更易于使用。例如,在我工作的地方,您只需运行此查询。

select cal_date
from calendar
where year_of_date = 2012
  and day_of_month = 1;

对于一个明显的查询,有很多话要说。

于 2012-06-23T11:25:33.527 回答
2

请尝试以下方法。您可能需要调整日期格式/时区

select to_date('2012/'||l||'/01', 'yyyy/mm/dd') 
from (select level l from dual connect by level < 13)

编辑:正如评论中的操作所提供的,需要采用当前年份而不是对其进行硬编码。更新后的查询是

SELECT L || '/01/' || TO_CHAR (SYSDATE, 'YYYY') DATESS FROM 
(SELECT LEVEL L FROM DUAL CONNECT BY LEVEL < 13)
于 2012-06-23T10:40:48.173 回答
1

如果您只想使用日期函数来获取特定年份的值,您可以使用以下语句,也可以使用 SQL Fiddle'd

select add_months(trunc(last_day(add_months(trunc(to_date('2011'
                                                         ,'yyyy')
                                                  , 'y')
                                            , -1)
                                 ) + 1
                        )
                 , level - 1) 
  from dual
connect by level <= 12

这会将您的“年”转换为日期,将其截断为 1 月 1,因为默认情况下to_date('2011', 'yyyy')会返回该年的当前日期。然后它会删除一个月,将我们带到 2010 年 12 月 1。获取该月的最后一天,即 12 月 31并添加一天,所以回到 1 月 1 日,但我也做了一个connect by level并添加level - 1,即0 一月返回正确的日期。

不幸的是,Oracle 没有first_day功能,这会使这变得容易得多。

今年大致相同:

select add_months(trunc(last_day(add_months(trunc(sysdate,'y'),-1)) + 1), level - 1) 
  from dual
 connect by level <= 12
于 2012-06-23T10:57:19.437 回答