在oracle SQL中查询会计月份的天数
Posted
技术标签:
【中文标题】在oracle SQL中查询会计月份的天数【英文标题】:Query to find day number of the fiscal month in oracle SQL 【发布时间】:2018-09-14 09:03:52 【问题描述】:查询应返回当前会计月份的天数。请检查以下查询:
SELECT *
FROM GL_PERIODS
WHERE PERIOD_SET_NAME='Fiscal Year'
AND period_year =(SELECT DISTINCT period_year
FROM gl_periods
WHERE TRUNC (SYSDATE) BETWEEN start_date
AND end_date)
对于时间段名称:SEP-19,开始日期为 8/26/2018。因此,sysdate 的天数应该是 16。
样本数据:
period_set_name period_name start_date end_date entered_period_name
Fiscal Year AUG-19 7/29/2018 8/25/2018 AUG
Fiscal Year SEP-19 8/26/2018 9/22/2018 SEP
Fiscal Year OCT-19 9/23/2018 10/27/2018 OCT
预期输出:16
【问题讨论】:
您的样本数据没有period_year
列,period_name
与entered_period_name
和end_date
中的月份匹配,但与start_date
和end_date
中的年份不匹配。
如何得到16
的预期输出?今天的日期是 2018-09-14
,这是您的 SEP
期间的第 20 天(26 日至 30 日是 8 月的 6 天,9 月 1 日至 14 日是 9 月的 14 天)。
【参考方案1】:
我们可以对日期进行算术运算。所以今天的会计日数是:
SELECT (trunc(sysdate) - start_date) + 1 as fiscal_day_no
FROM GL_PERIODS
WHERE PERIOD_SET_NAME='Fiscal Year'
AND period_year =(SELECT DISTINCT period_year
FROM gl_periods
WHERE TRUNC (SYSDATE) BETWEEN start_date
AND end_date)
这假设您没有特殊要求来处理,例如周末或公共假期。
【讨论】:
【参考方案2】:Oracle 设置:
CREATE TABLE GL_PERIODS(
period_set_name VARCHAR2(20),
start_date DATE,
end_date DATE,
period_name CHAR(6) GENERATED ALWAYS AS ( CAST( TO_CHAR( end_date, 'MON-YY' ) AS CHAR(6) ) ) VIRTUAL,
entered_period_name CHAR(3) GENERATED ALWAYS AS ( CAST( TO_CHAR( end_date, 'MON' ) AS CHAR(3) ) ) VIRTUAL,
period_year NUMBER(4) GENERATED ALWAYS AS ( EXTRACT( YEAR FROM end_date ) ) VIRTUAL
);
INSERT INTO GL_PERIODS( period_set_name, start_date, end_date )
SELECT 'Fiscal Year', DATE '2018-07-29', DATE '2018-08-25' FROM DUAL UNION ALL
SELECT 'Fiscal Year', DATE '2018-08-26', DATE '2018-09-22' FROM DUAL UNION ALL
SELECT 'Fiscal Year', DATE '2018-09-23', DATE '2018-10-27' FROM DUAL;
查询:
SELECT TRUNC( SYSDATE - start_date + 1 ) AS fiscal_day_no
FROM GL_PERIODS
WHERE start_date <= SYSDATE
AND SYSDATE < END_DATE + INTERVAL '1' DAY;
输出:
| FISCAL_DAY_NO |
|---------------|
| 20 |
【讨论】:
以上是关于在oracle SQL中查询会计月份的天数的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 SQL 查询中输入 0 到 11 之间的月份时出现 oracle 错误 ORA-01843