大家好,我正在尝试获取一年中所有月份的 Ist 日期,例如 Curretn 年份是 2012 年,我想从查询中获得以下结果
1-JAN-2012
1-FEB-2012
1-APR-2012
.
.
.
.
.
.
1-DEC-2012
有没有人可以解决我的问题提前谢谢
只是为了完整性 - 这是一个更简单的版本:
select ADD_MONTHS(TRUNC(SYSDATE,'Y'),ROWNUM-1)
from dual connect by level <= 12;
日历表更易于使用。例如,在我工作的地方,您只需运行此查询。
select cal_date
from calendar
where year_of_date = 2012
and day_of_month = 1;
对于一个明显的查询,有很多话要说。
请尝试以下方法。您可能需要调整日期格式/时区
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)
如果您只想使用日期函数来获取特定年份的值,您可以使用以下语句,也可以使用 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