如何根据公历计算Oracle SQL中一个期间的第一个日期和最后一个日期

Posted

技术标签:

【中文标题】如何根据公历计算Oracle SQL中一个期间的第一个日期和最后一个日期【英文标题】:How to calculate the first date and last date in a Period in Oracle SQL as per Gregorian Calendar 【发布时间】:2018-01-03 17:24:33 【问题描述】:

我想根据4-4-5 calendar 构建一个查询来获取Oracle SQL 数据库中某个时期的第一个日期和最后一个日期,以实现如下所示:

任何人都可以帮助我吗?我尝试了以下查询,但无法达到目的:

alter session set NLS_TERRITORY = 'THE NETHERLANDS';
alter session set NLS_CALENDAR='GREGORIAN';
SELECT add_months(trunc(sysdate) - (to_number(to_char(sysdate,'DD')) - 1), 1) -1 FROM dual;

【问题讨论】:

我附上了同样的截图。请检查! 您能否编辑问题并在问题中举例说明您要查找的内容? 只说“4-4-5 日历”似乎还不够。您似乎需要提供更多详细信息 - 例如,提供第一个月的第一天作为输入。或者,您需要说明财政年度是什么(1 月到 12 月?7 月到下一个 6 月?等等),“周”的定义(周一到周日?周日到周六?等等)以及财政年度的确切开始时间和/或结束(会计年度的第一个星期一被视为会计年度的第一天?还有什么其他约定?) 关键点是第一期的开始。为什么是 2.1.2017? 2017 年 1 月 1 日是否因为是星期天而被跳过?如果你描述了第一阶段开始的规则,那么任务就解决了;其他都是简单的算术...... 【参考方案1】:

第一个周期的初始日期要么是外部提供的(我是在 WITH 子句中提供的;更有可能是绑定变量或过程的 in 参数),或者可以根据规则计算, 在单独的代码块中。

有了给定或计算出的初始日期,剩下的就可以完成了,例如,如下所示。

with
  inputs ( input_date ) as (
    select date '2017-01-02' from dual
  )
select level as period_number,
       input_date + 28 * (level - 1) + 7 * trunc((level-1)/3) as period_start,
       input_date + 28 *  level - 1  + 7 * trunc( level   /3) as period_end,
       case mod(level, 3) when 0 then 35 else 28 end          as days_in_period
from   inputs
connect by level <= 12
;



PERIOD_NUMBER PERIOD_START PERIOD_END   DAYS_IN_PERIOD
------------- ------------ ------------ --------------
            1 2-1-2017     29-1-2017                28
            2 30-1-2017    26-2-2017                28
            3 27-2-2017    2-4-2017                 35
            4 3-4-2017     30-4-2017                28
            5 1-5-2017     28-5-2017                28
            6 29-5-2017    2-7-2017                 35
            7 3-7-2017     30-7-2017                28
            8 31-7-2017    27-8-2017                28
            9 28-8-2017    1-10-2017                35
           10 2-10-2017    29-10-2017               28
           11 30-10-2017   26-11-2017               28
           12 27-11-2017   31-12-2017               35

【讨论】:

以上是关于如何根据公历计算Oracle SQL中一个期间的第一个日期和最后一个日期的主要内容,如果未能解决你的问题,请参考以下文章

如何将公历字符串转换为公历?

Oracle SQL:根据每个分区中的第一行进一步对 PARTITION BY 组进行排序

ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)

java根据日期计算24节气

Oracle SQL - 将一个多行查询列除以另一个

SQL如何计算订单购买之间的平均时间? (根据下一行和上一行进行sql计算)