sysdate的当前财政年度

时间:2015-11-26 12:56:32

标签: sql oracle date-arithmetic

我似乎无法找到一个直截了当的SQL而没有深入研究PL SQL,因为总是把当前的财政年度01-04-2015带到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')) 

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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))

答案 2 :(得分:0)

SELECT *
FROM   your_table
WHERE  datetime >= CASE
                   WHEN SYSDATE < TRUNC( SYSDATE, 'YEAR' ) + INTERVAL '3' MONTH 
                   THEN TRUNC( SYSDATE, 'YEAR' ) - INTERVAL '9' MONTH
                   ELSE TRUNC( SYSDATE, 'YEAR' ) + INTERVAL '3' MONTH
                   END;

答案 3 :(得分:0)

谢谢,以下工作! add_months(trunc(sysdate,'year'),3)AND sysdate

谢谢大家的意见:)

答案 4 :(得分:0)

  

REPAIR_CURRENT.REP_RAISED_DATE&#39; 01-APR-2015&#39; AND sysdate

首先,'01-APR-2015'不是 DATE ,它是字符串。您必须始终使用 TO_DATE 以及正确的格式模型,以字符串显式转换为 DATE 。或者,使用 ANSI Date literal ,因为您不关心时间部分。它使用固定格式'YYYY-MM-DD'

现在,进入您的日期算术,您可以使用 CASE表达式来评估财务日期,具体取决于

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

基本上,SYSDATE >= ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), 3)用于检查 SYSDATE 是否大于当前是 r的1-APR。而且,SYSDATE < ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), 15)用于检查明年是JANMARCH之间

例如,

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

FINANCIAL
---------
01-APR-15

明年的 JAN MAR 之间的日期:

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

答案 5 :(得分:0)

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

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:2020年1月4日的示例

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;