一个Oracle面试题目 [日期间隔按格式输出]

本文深入解析了一道SQL难题,利用Oracle特有的函数如ADD_MONTHS、TO_DATE、TO_CHAR、LAST_DAY和MONTHS_BETWEEN,通过构建特定的查询逻辑,实现了从给定的起始年月到截至年月之间的日期区间操作,输出每个月份的第一天和最后一天。此过程涉及日期转换、日期加减和日期间隔计算,展示了Oracle SQL的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目: 输入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提供的视图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值