【转载】oracle相关时间计算,得到季度第一天、最后一天

本文深入探讨了Oracle中日期操作的关键技巧与实例,包括获取当前日期、月份、季度、一周、一天等信息,以及计算日期差、判断闰年、获取特定日期等功能,提供了丰富的SQL查询实践案例。

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

转自 http://blog.youkuaiyun.com/jjgjlf/article/details/6640346


------------------------------------------------ Oracle 日期------------------------------------------

-- 本季度第一天
SELECT to_char(TRUNC(SYSDATE, 'Q'), 'YYYY-MM-DD') FROM dual;


-- 上个季度最后一天(可以用本季度第一天减去1得到)
SELECT to_char(TRUNC(SYSDATE, 'Q') - 1, 'YYYY-MM-DD') FROM dual;


-- 上个季度第一天(本季度第一天 减 3个月)
SELECT to_char(add_months(TRUNC(SYSDATE, 'Q'), -3), 'YYYY-MM-DD')
  FROM dual;


-- 上个季度第一天(本季度减一个月之后的月份的最后一天)
select to_char(last_day(add_months(trunc(sysdate, 'Q'), -1)), 'yyyy-mm-dd')
  from dual
  
--№1: 取得当前日期是本月的第几周  
select to_char(sysdate,'YYYYMMDD    W    HH24:MI:SS')   from   dual; 
select to_char(sysdate, 'W') from dual;
  
  
--№2:取得当前日期是一个星期中的第几天,注意星期日是第一天
select sysdate, to_char(sysdate, 'D') from dual;
--类似:
select to_char(sysdate, 'yyyy') from dual; --当前年 
select to_char(sysdate, 'Q' ) from dual; --当前季度
select to_char(sysdate, 'mm') from dual; --当前月 
select to_char(sysdate, 'dd') from dual; --当前日




--№3:取当前日期是星期几的中文显示:
select   to_char(sysdate, 'day')   from   dual; 


--№4:如果一个表在一个date类型的字段上面建立了索引,如何使用
alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'


--№5: 得到当前的日期
select sysdate from dual;


--№6: 得到当天凌晨0点0分0秒的日期
select to_char(trunc(sysdate), 'yyyymmdd hh:mi:ss' ) from dual;


-- 得到这天的最后一秒
select trunc(sysdate) + 0.99999 from dual;


-- 得到小时的具体数值
select trunc(sysdate) + 1 / 24 from dual;
select trunc(sysdate) + 7 / 24 from dual;


--№7:得到明天凌晨0点0分0秒的日期
select trunc(sysdate + 1) from dual;
select trunc(sysdate) + 1 from dual;


--№8: 本月一日的日期
select trunc(sysdate, 'mm') from dual;


--№9:得到下月一日的日期
select add_months(trunc(sysdate, 'mm'), 1) from dual;
select trunc(add_months(sysdate, 1), 'mm') from dual;


-- №10:返回当前月的最后一天?
select last_day(sysdate) from dual;
select last_day(trunc(sysdate)) from dual;
select trunc(last_day(sysdate)) from dual;
select trunc(add_months(sysdate, 1), 'mm') - 1 from dual;


--№11: 得到一年的第一天 
select trunc(sysdate, 'y') from dual


--№11: 得到一年的每一天 
select trunc(sysdate, 'yyyy') + rn - 1 date0
  from (select rownum rn from all_objects where rownum < 366) t;


--№12:今天是今年的第N天
SELECT TO_CHAR(SYSDATE, 'DDD') FROM DUAL;


--№13:如何在给现有的日期加上2年
select add_months(sysdate, 24) from dual;


--№14:判断某一日子所在年分是否为润年
select last_day(trunc(sysdate, 'yyyy') + 31) from dual   -- 通过一年的第一天加上31天到2月,然后取2月最后一天
select decode(to_char(last_day(trunc(sysdate, 'y') + 31), 'dd'),
              '29',
              '闰年',
              '平年')
  from dual;


--№15:判断两年后是否为润年
select decode(to_char(last_day(trunc(add_months(sysdate, 24), 'y') + 31), 'dd'),
              '29',
              '闰年',
              '平年')
  from dual;


--№16:得到日期的季度
select trunc(sysdate, 'mi') from dual ;
select to_number(to_char(sysdate,'mm')) from dual;
select ceil(to_number(to_char(sysdate,'mm'))/3) from dual;
select to_char(sysdate, 'Q') from dual;


--No17:返回某个月的最后一天

select to_char(last_day(sysdate), 'dd') from dual



--本周的第一天和最后一天,考虑到中国人习惯是周一为每周的第一天(国际惯例是周日为第一天,oracle也是这样)
select trunc(sysdate,'d')+1,trunc(sysdate,'d')+7 from dual where to_char(sysdate,'day')<>'星期日'
union all
select trunc(sysdate,'d')+1-7,trunc(sysdate,'d')+7-7 from dual where to_char(sysdate,'day')='星期日'


--当前季度的第一天
select to_char(trunc(sysdate,'Q'),'yyyy-mm-dd') from dual;
--当前季度的最后一天
SELECT to_char(add_months(TRUNC(SYSDATE, 'Q'), +3)-1, 'YYYY-MM-DD')
  FROM dual;


select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天",
       to_char(last_day(sysdate), 'yyyy-mm-dd') "本月最后一天" FROM dual;
<think>好的,我现在需要帮用户解决如何在Oracle数据库中获取当前月份的第一天最后一天的问题。用户已经提供了四个相关的引用链接,我需要先仔细看看这些引用里提到的方法,然后整理出一个清晰的步骤。 首先,我应该回忆一下Oracle中处理日期的函数,比如TRUNC和LAST_DAY。根据引用[1]和[2],用户提到了使用TRUNC函数来获取本月的第一天,而LAST_DAY函数可以获取当月的最后一天。比如,TRUNC(SYSDATE, 'MM')会把日期截断到月份的第一天,而LAST_DAY(SYSDATE)则返回当月的最后一天。这应该就是关键的函数。 然后,我需要检查这些方法是否正确。比如,TRUNC(SYSDATE, 'MM')是否真的返回当月的第一天。比如,如果今天是2023-10-15,TRUNC会把它变成2023-10-01吗?是的,TRUNC函数当第二个参数是'MM'时,确实会截断到月份的第一天。而LAST_DAY(SYSDATE)会返回2023-10-31,假设当月是10月的话。这样看来,这两个函数组合起来就能得到所需的第一天最后一天。 接下来,用户可能需要具体的SQL语句示例。根据引用[1]中的例子,用户使用了TO_CHAR来转换日期格式,但用户的问题只是要获取日期,所以可能需要用TO_DATE或者直接使用TRUNC的结果。不过,用户可能希望日期以特定的格式显示,比如YYYY-MM-DD,所以可能需要使用TO_CHAR来格式化输出。 另外,引用[3]中提到了TRUNC(SYSDATE, 'YYYY')返回当年的第一天,这说明TRUNC函数的不同参数可以处理不同时间部分。同理,'MM'对应月份,'DD'对应天等等。因此,使用TRUNC(SYSDATE, 'MM')是正确的。 再看看引用[4],其中有一个例子使用了LAST_DAY(SYSDATE)来获取当月最后一天,这也验证了LAST_DAY函数的正确使用。 综合这些信息,正确的SQL应该是: SELECT TRUNC(SYSDATE, 'MM') AS 本月第一天, LAST_DAY(SYSDATE) AS 本月最后一天 FROM DUAL; 或者,如果需要格式化输出,可以加上TO_CHAR: SELECT TO_CHAR(TRUNC(SYSDATE, 'MM'), 'YYYY-MM-DD') AS 本月第一天, TO_CHAR(LAST_DAY(SYSDATE), 'YYYY-MM-DD') AS 本月最后一天 FROM DUAL; 不过用户可能只需要日期类型,所以第一种可能更直接。 现在要确保没有错误。比如,TRUNC(SYSDATE, 'MM')是否在所有的Oracle版本中都适用?根据文档,这个函数在Oracle中确实支持,且参数'MM'或'MONTH'都可以。所以应该是可靠的。 总结步骤的话,就是使用TRUNC函数获取当月第一天,LAST_DAY函数获取最后一天,然后通过SELECT语句从DUAL表中取出这两个值。这应该能满足用户的需求。 另外,用户可能在应用中需要动态获取,而不仅仅是当前时间,所以可能需要参数化,但用户的问题是关于当前时间的,所以直接使用SYSDATE即可。 最后,生成相关问题的时候,要考虑用户可能对日期处理的其他需求,比如上个月或下个月的日期,或者年份的处理,或者TRUNC函数的其他用法。根据引用中的内容,相关问题可以包括如何获取上个月的第一天最后一天,或者如何使用TRUNC函数处理年份,或者其他日期函数如ADD_MONTHS的应用。</think>### Oracle获取当前月份第一天最后一天的日期 在Oracle数据库中,可以通过以下步骤获取当前月份的第一天最后一天日期: **1. 获取本月第一天** 使用`TRUNC()`函数将当前日期截断到月份级别,返回当月第一天: ```sql SELECT TRUNC(SYSDATE, 'MM') AS 本月第一天 FROM DUAL; ``` `TRUNC(SYSDATE, 'MM')`会将日期截断为`YYYY-MM-01`格式[^3]。 **2. 获取本月最后一天** 使用`LAST_DAY()`函数直接获取当月最后一天: ```sql SELECT LAST_DAY(SYSDATE) AS 本月最后一天 FROM DUAL; ``` `LAST_DAY()`会自动计算当前月份的最后一天日期[^2]。 **3. 完整示例(格式化输出)** 若需要格式化为`YYYY-MM-DD`,可结合`TO_CHAR()`: ```sql SELECT TO_CHAR(TRUNC(SYSDATE, 'MM'), 'YYYY-MM-DD') AS 本月第一天, TO_CHAR(LAST_DAY(SYSDATE), 'YYYY-MM-DD') AS 本月最后一天 FROM DUAL; ``` ### 注意事项 - 若需要其他月份的日期(如上月或下月),可使用`ADD_MONTHS()`调整基准日期,例如: ```sql SELECT LAST_DAY(ADD_MONTHS(SYSDATE, -1)) AS 上月最后一天 FROM DUAL; ``` - `TRUNC()`函数还支持按年、季度等截断日期[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值