Oracle 获取本周、本月、本季、本年的第一天和最后一天

Oracle日期操作技巧
本文提供了在Oracle数据库中获取特定时间范围(如周、月、季度和年)的开始与结束日期的方法。通过简单的SQL语句,可以快速找到本周、本月、本季及本年的第一天与最后一天。

在Oracle数据库查询统计的时候经常会用周、月、季度和年的第一天和最后一天。

找了一个整理好的分享给大家:

--本周
select trunc(sysdate, 'd') + 1 from dual;
select trunc(sysdate, 'd') + 7 from dual;
--本月
select trunc(sysdate, 'mm') from dual;
select last_day(trunc(sysdate)) from dual;
--本季
select trunc(sysdate, 'Q') from dual;
select add_months(trunc(sysdate, 'Q'), 3) - 1 from dual;
--本年
select trunc(sysdate, 'yyyy') from dual;
select add_months(trunc(sysdate, 'yyyy'), 12) - 1 from dual;
 
 
-- 获取上月的开始时间和结束时间
select to_char(to_date(to_char(add_months(sysdate, -1), 'yyyy-mm'),'yyyy-mm'),'yyyy-mm-dd hh24:mi:ss')
  from dual;
select to_char(to_date(to_char(sysdate, 'yyyy-mm'), 'yyyy-mm'),'yyyy-mm-dd hh24:mi:ss')
  from dual;
-- 获取前一天的开始时间和结束时间
select to_char(to_date(to_char(sysdate - 1, 'yyyy-mm-dd'), 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')
  from dual;
select to_char(to_date(to_char(sysdate, 'yyyy-mm-dd'), 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')
  from dual;
-- 获取上一个小时的开始时间和结束时间
select to_date(to_char(sysdate, 'yyyy-mm-dd') || (to_char(sysdate, 'hh24') - 1),'yyyy-mm-dd hh24')
  from dual;
select to_date(to_char(sysdate, 'yyyy-mm-dd') || (to_char(sysdate, 'hh24')),'yyyy-mm-dd hh24')
  from dual;

转载:http://you-java.iteye.com/blog/1431534
<think>首先,用户的问题是:“我想获取Oracle中截取本年第一天最后一天的日期函数 请问Oracle 获取本年第一天最后一天的日期函数”。这直接询问Oracle SQL函数来获取本年第一天最后一天。 从系统指令中,我有几个引用:[^1]、[^2]、[^3],这些提供了相关SQL代码的示例。让我回顾这些引用: - 引用[^1]:提到“本年第一天 select trunc(sysdate,'yyyy') from dual;”本年最后一天 select add_months(trunc(sysdate,'yyyy'),12) - 1 from dual;” - 引用[^2]:虽然主要是关于上个月,但提到了“select to_char(trunc(add_months(sysdate,-1),'mm'),'yyyymmdd') first_day,to_char(last_day(add_months(sysdate,-1)),'yyyymmdd') last_day from dual;”,这不直接相关,但展示了使用trunclast_day。 - 引用[^3]:提到“select to_char(sysdate,'yyyy-mm')||'-01' firstday,to_char(last_day(sysdate),'yyyy-mm-dd') lastday from dual”,但这似乎是为月度设计的,不是年度。 用户的需求是获取本年第一天最后一天。引用[^1]直接给出了解决方案:trunc(sysdate,'yyyy') 用于本年第一天,add_months(trunc(sysdate,'yyyy'),12) - 1 用于本年最后一天。 trunc(sysdate,'yyyy') 返回本年第一天的日期,例如2023-01-01。 add_months(trunc(sysdate,'yyyy'),12) - 1:add_months(trunc(sysdate,'yyyy'),12) 会给出下一年的第一天,然后减去1天就得到本年最后一天。例如,如果今年是2023年,trunc(sysdate,'yyyy') 是2023-01-01,add_months to 12 months 是2024-01-01,减去1天是2023-12-31。 在Oracle中,last_day函数通常用于月份,不是年份。所以对于年份的最后一天,使用add_months(trunc(sysdate,'yyyy'),12) - 1 是标准方法。 引用[^3]中有一个查询:select to_char(sysdate,'yyyy-mm')||'-01' firstday, to_char(last_day(sysdate),'yyyy-mm-dd') lastday from dual,但这只适用于月份,不是年份。to_char(sysdate,'yyyy-mm')||'-01' 给出本月第一天,last_day(sysdate) 给出本月最后一天。所以不适合年份。 因此,我应该基于引用[^1]提供代码。 现在,系统指令要求: - 所有行内数学表达式用$...$,但这里没有数学表达式,主要是SQL代码。 - 独立公式用$$...$$,但SQL代码不是公式,所以不需要。 - LaTeX语法正确:但SQL代码应该用代码块。 - 使用中文回答:用户的问题是中文的,所以我用中文回复。 - 生成相关问题:在回答后,我需要生成相关问题。 - 回答中引用的段落末尾添加引用标识:例如[^1]。 用户可见层要求:结构清晰,逐步解决问题,保证真实可靠。 所以,我的回答结构: 1. 直接回答用户问题:提供SQL函数来获取本年第一天最后一天。 2. 解释代码(可选,但有助于用户理解)。 3. 给出示例代码块。 4. 添加引用。 5. 生成相关问题。 最后,生成相关问题:基于主题,我可以问一些扩展问题。 相关问题想法: 1. 如何获取其他时间范围,如季度或月份的第一天最后一天? 2. 如何格式化输出日期? 3. Oracle中日期函数的高级用法? 4. 性能考虑或优化? 5. 实际应用场景。 现在,构建回答: - 开头:确认用户需求。 - 主体:提供SQL查询。 - 解释:简要说明函数。 - 引用:添加[^1] 因为主要来自那里。 - 代码块:用SQL。 - 相关问题。</think>### Oracle 获取本年第一天最后一天的日期函数 在 Oracle 数据库中,您可以使用内置的日期函数来获取本年第一天最后一天。核心函数是 `TRUNC()` `ADD_MONTHS()`,结合 `SYSDATE` 获取当前日期。以下是具体实现方法,基于标准 Oracle SQL 语法: #### 1. **获取本年第一天** - 使用 `TRUNC(SYSDATE, 'YYYY')` 函数:该函数将当前日期截断为本年第一天的日期(即1月1日)。 - 示例 SQL: ```sql SELECT TRUNC(SYSDATE, 'YYYY') AS 本年第一天 FROM DUAL; ``` - 输出示例:如果当前日期是2024-07-21,则返回 `2024-01-01`。 #### 2. **获取本年最后一天** - 使用 `ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 12) - 1`:先获取本年第一天,然后加上12个月得到下一年的第一天,再减去1天得到本年最后一天(即12月31日)。 - 示例 SQL: ```sql SELECT ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 12) - 1 AS 本年最后一天 FROM DUAL; ``` - 输出示例:如果当前日期是2024-07-21,则返回 `2024-12-31`。 #### 完整查询示例 您可以将两个函数合并到一个查询中,以同时获取本年第一天最后一天: ```sql SELECT TRUNC(SYSDATE, 'YYYY') AS 本年第一天, ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 12) - 1 AS 本年最后一天 FROM DUAL; ``` - **输出结果**: - 本年第一天:2024-01-01(格式为日期类型,如需要字符串可添加 `TO_CHAR()`) - 本年最后一天:2024-12-31 #### 解释说明 - `TRUNC(SYSDATE, 'YYYY')`:`TRUNC` 函数用于截断日期,参数 `'YYYY'` 指定年份级别,返回本年的起始日期[^1]。 - `ADD_MONTHS()`:用于添加指定月数,结合减法(`-1`)处理日期边界,确保获取最后一天[^1]。 - `DUAL`:Oracle 内置的虚拟表,用于快速测试函数。 - **日期格式化**:如果需要将结果转为特定字符串格式(如 `YYYY-MM-DD`),可使用 `TO_CHAR()` 函数,例如: ```sql SELECT TO_CHAR(TRUNC(SYSDATE, 'YYYY'), 'YYYY-MM-DD') AS 本年第一天, TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 12) - 1, 'YYYY-MM-DD') AS 本年最后一天 FROM DUAL; ``` 这些函数高效可靠,已在 Oracle 环境中广泛使用。如果您需要处理其他日期范围(如季度或月份),可以调整参数,更多细节可参考 Oracle 官方文档[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值