Sql 本财政年度截止日期

Sql 本财政年度截止日期,sql,oracle,date-arithmetic,Sql,Oracle,Date Arithmetic,如果不深入研究PL sql,我似乎无法找到一个简单的sql,因为它总是将当前财政年度(2015年4月1日)设置为sysdate。我希望此信息始终自动更新,以便在2016年4月1日的下一个财政年度中,无论从该日期起到报告运行时,它都会带来所持有的任何信息 如果有人能帮我解释一下。谢谢 sql是: SELECT PROPERTY.PRO_MANAGINGCOMPANY_DESCR, PROPERTY.PRO_SCHEME_DESCR, PROPERTY.PRO_SCHEME, SUM

如果不深入研究PL sql,我似乎无法找到一个简单的sql,因为它总是将当前财政年度(2015年4月1日)设置为sysdate。我希望此信息始终自动更新,以便在2016年4月1日的下一个财政年度中,无论从该日期起到报告运行时,它都会带来所持有的任何信息

如果有人能帮我解释一下。谢谢

sql是:

SELECT
  PROPERTY.PRO_MANAGINGCOMPANY_DESCR,
  PROPERTY.PRO_SCHEME_DESCR,
  PROPERTY.PRO_SCHEME,
  SUM(REPAIR_CURRENT.REP_ESTIMATED_COST) as "Estimated Cost",
  nvl(SUM(REPAIR_CURRENT.REP_INVOICED_COST),SUM(REPAIR_CURRENT.REP_ESTIMATED_COST)) as "Estimated Cost Invoiced",
  SUM(REPAIR_CURRENT.REP_INVOICED_COST) as "Invoice Cost",
  to_char(REPAIR_CURRENT.REP_RAISED_DATE,'Mon') as "Month",
  to_number(to_char(to_date(REPAIR_CURRENT.REP_RAISED_DATE,'dd-mon-yy'),'mm')) as "Month No."
FROM
 PROPERTY,
  REPAIR_CURRENT,
  SERVICE_REQUEST
WHERE
  ( SERVICE_REQUEST.SRQ_PRO_REFNO=PROPERTY.PRO_REFNO  )
  AND  ( REPAIR_CURRENT.REP_SRQ_NO=SERVICE_REQUEST.SRQ_NO  )
  AND  
  (
  --PROPERTY.PRO_SCHEME  =   ( '00054'  )
   --AND
   REPAIR_CURRENT.REP_RAISED_DATE  BETWEEN  '01-APR-2015'  AND  sysdate
   AND
   REPAIR_CURRENT.REP_STATUS  <>  'CAN'
  )
GROUP BY
  PROPERTY.PRO_MANAGINGCOMPANY_DESCR,
  PROPERTY.PRO_SCHEME_DESCR,
  PROPERTY.PRO_SCHEME,
  to_char(REPAIR_CURRENT.REP_RAISED_DATE,'Mon'),
  to_number(to_char(to_date(REPAIR_CURRENT.REP_RAISED_DATE,'dd-mon-yy'),'mm')) 
选择
PROPERTY.PRO_管理公司描述,
PROPERTY.PRO_SCHEME_DESCR,
PROPERTY.PRO_计划,
总和(维修当前维修预计成本)为“预计成本”,
nvl(金额(维修费用、当前维修费用、发票费用)、金额(维修费用、当前维修费用、预计维修费用)为“预计发票费用”,
“发票成本”之和(维修当前代表发票成本),
将字符(修复当前.REP提出的日期,'Mon')改为“月”,
to编号(to char(to date(修复当前的代表提出的日期,'dd-mon-yy'),'mm'))为“月号”
从…起
财产,,
修复U电流,
服务请求
哪里
(服务请求.SRQ\u PRO\u REFNO=PROPERTY.PRO\u REFNO)
和(REPAIR_CURRENT.REP_SRQ_NO=SERVICE_REQUEST.SRQ_NO)
及
(
--PROPERTY.PRO_方案=('00054')
--及
修复日期在“2015年4月1日”和系统日期之间
及
修复\u当前.REP\u状态“无法”
)
分组
PROPERTY.PRO_管理公司描述,
PROPERTY.PRO_SCHEME_DESCR,
PROPERTY.PRO_计划,
to_char(修复_CURRENT.REP_RAISED_DATE,'Mon'),
to_编号(to_char(to_date(修复当前的代表提出的日期,'dd-mon-yy'),'mm'))

如果您只想获取当前日期的会计年度开始日期:

SELECT TO_DATE('01-04' || CASE 
                            WHEN EXTRACT(MONTH FROM SYSDATE) > 4 THEN 
                              EXTRACT(YEAR FROM SYSDATE) 
                            ELSE 
                              EXTRACT(YEAR FROM SYSDATE)-1 
                            END, 'DD-MM-RRRR') FISCAL_YEAR 
FROM DUAL
选择*
从你的桌子上
其中datetime>=大小写
当SYSDATE
谢谢,下面的方法奏效了!添加月份(trunc(sysdate,'year')、3)和sysdate

谢谢大家的意见:)

修复日期在“2015年4月1日”和系统日期之间

首先,
'01-APR-2015'
不是日期而是字符串。您必须始终使用到日期以及适当的格式模型显式地将字符串转换为日期。或者,使用ANSI日期文字,因为您不关心时间部分。它使用固定格式
'YYYY-MM-DD'

现在,关于日期算术,您可以使用一个大小写表达式来计算财务日期,具体取决于年份

REP_RAISED_DATE 
BETWEEN
   CASE
   WHEN 
      SYSDATE <  ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), 3) 
   THEN
      ADD_MONTHS(TRUNC(SYSDATE, 'YEAR') , -9)
   ELSE 
      ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), 3)
   END 
AND SYSDATE
对于下一年的一月三月之间的日期:

SQL> SELECT
  2     CASE
  3       WHEN
  4          DATE '2016-02-01' <  ADD_MONTHS(TRUNC(DATE '2016-02-01', 'YEAR'), 3)
  5       THEN
  6          ADD_MONTHS(TRUNC(DATE '2016-02-01', 'YEAR') ,-9)
  7       ELSE
  8          ADD_MONTHS(TRUNC(DATE '2016-02-01', 'YEAR'), 3)
  9     END FINANCIAL_YEAR
 10  FROM dual;

FINANCIAL
---------
01-APR-15
SQL>SELECT
2例
3何时
4日期“2016-02-01”<增加月数(TRUC(日期“2016-02-01”,“年”),3)
那么
6个月(TRUC(日期“2016-02-01”,“年”),-9)
7其他
8个月(TRUC(日期“2016-02-01”,“年”),3)
9财政年度末
10名来自双重国籍;
财务
---------
2015年4月1日

这适用于任何日期:

REPAIR_CURRENT.REP_RAISED_DATE
  BETWEEN Add_Months(Trunc(Add_Months(sysdate,-3),'YYYY'),3)
      AND Sysdate
基本上,减去三个月,截短到一年,再加上三个月

要仅获取某个日期的财政年度,请使用:

Extract(Year from Add_Months(Trunc(Add_Months(sysdate,-3),'YYYY'),3))

以下SQLreturns返回当前日期的财政年度的开始和结束日期

SELECT 
TO_DATE('01-04' ||   EXTRACT(YEAR FROM add_months(sysdate, -3)),'DD-MM-RRRR') from_dt , 
TO_DATE('31-03' ||   EXTRACT(YEAR FROM add_months(sysdate, 9)),'DD-MM-RRRR') to_dt from dual;
对于任何随机日期,都可以使用以下SQL:example For 01-04-2020

SELECT 
TO_DATE('01-04' ||   EXTRACT(YEAR FROM add_months(to_date('01-04-2020','DD-MM-RRRR'), -3)),'DD-MM-RRRR') from_dt , 
TO_DATE('31-03' ||   EXTRACT(YEAR FROM add_months(to_date('01-04-2020','DD-MM-RRRR'), 9)),'DD-MM-RRRR') to_dt from dual;

是否要生成从2015年4月1日到当前日期的日期?是,对于当前财务期间,它将是2015年4月1日,但是我不想硬编码这个日期,但是我想知道我是否可以使用一个函数来收集第一个日期,并且只收集第四个月的日期function@abs786123使用一个简单的
CASE
表达式检查当前日期并获得所需的输出。您必须提供一些示例数据并显示所需的输出。至少创建一个SQL FIDLE。嗨,刚刚添加了我一直在使用的实际SQLon@abs786123好的,正如我所说的,在过滤器谓词中使用
CASE
表达式。请看我的答案。当当前日期在1月和3月之间时,它将不起作用。请不要添加“谢谢”作为答案,而是向上投票/接受对您有帮助的答案。如果你愿意,你可以对帮助你的答案发表评论。答案部分应仅用于发布答案。请仔细阅读以了解此网站的工作原理。祝你一切顺利!你有点不对劲。请参阅我的答案,了解类似但有效的方法。您希望
=
而不是
案例没有
ELSE
条件,因此如果当前日期在1月和3月之间,它将永远不会返回任何结果。
SYSDATE
将始终为真,如果是在1月至3月,则您要减去9个月(请参阅)-如果您加上15个月,则将是未来两年财年的开始。您是对的,我的测试不正确。我在L.H.S.中检查了硬编码日期,但在R.H.S.中没有检查到。因此,基本上,我开始以与功能相反的顺序编写SQL。现在更正。当SYSDATE,而是提取时(从SYSDATE开始的月份)
SELECT 
TO_DATE('01-04' ||   EXTRACT(YEAR FROM add_months(sysdate, -3)),'DD-MM-RRRR') from_dt , 
TO_DATE('31-03' ||   EXTRACT(YEAR FROM add_months(sysdate, 9)),'DD-MM-RRRR') to_dt from dual;
SELECT 
TO_DATE('01-04' ||   EXTRACT(YEAR FROM add_months(to_date('01-04-2020','DD-MM-RRRR'), -3)),'DD-MM-RRRR') from_dt , 
TO_DATE('31-03' ||   EXTRACT(YEAR FROM add_months(to_date('01-04-2020','DD-MM-RRRR'), 9)),'DD-MM-RRRR') to_dt from dual;