日期:2014-05-17 浏览次数:20990 次
题目: 输入4个值[2008,12,2009,2], 要求一段SQL, 不另创新表, 得到如下结果: 
12 2008-12-1 2008-12-31 
01 2009-1-1 2009-1-31 
02 2009-2-1 2009-2-28 
条件: 起始年, 起始月, 截至年, 截至月 
结果: 月份, 月的第一天, 月的最后一天 
解答: 
Sql代码 
select to_char(tt.d, "mm"), tt.d, last_day(tt.d)????? 
? from (select ADD_MONTHS(zz.s, rownum - 1) d????? 
????????? from (select to_date("2008" || "12" || "01", "yyyymmdd") s,????? 
?????????????????????? to_date("2009" || "02" || "01", "yyyymmdd") e????? 
????????????????? from dual) zz,????? 
?????????????? (select * from user_objects)????? 
???????? where rownum <= MONTHS_BETWEEN(zz.e, zz.s) + 1) tt?? 
select to_char(tt.d, "mm"), tt.d, last_day(tt.d)?? 
? from (select ADD_MONTHS(zz.s, rownum - 1) d?? 
????????? from (select to_date("2008" || "12" || "01", "yyyymmdd") s,?? 
?????????????????????? to_date("2009" || "02" || "01", "yyyymmdd") e?? 
????????????????? from dual) zz,?? 
?????????????? (select * from user_objects)?? 
???????? where rownum <= MONTHS_BETWEEN(zz.e, zz.s) + 1) tt 
分析: 这个题目比较难, 因为考察了很多的Oracle特有的函数,表(视图). 
rownum 行号 
ADD_MONTHS 日期函数,给一个日期加一个月数,得到这个月数后的日期 
to_date 日期函数, 将一个字符以一定格式转成日期 
to_char 字符函数, 以一定格式得到字符 
last_day 日期函数, 得到某日所在月的最后一天 
MONTHS_BETWEEN 日期函数, 得到两个日期间隔的月数 
user_objects 是Oracle提供的视图