11

次のデータベース ビューでは、日付が会計年度 (4 月 1 日) に切り捨てられます。

CREATE OR REPLACE VIEW FISCAL_YEAR_VW AS
SELECT
  CASE
    WHEN to_number(to_char(SYSDATE, 'MM')) < 4 THEN    
      to_date('1-APR-'||to_char(add_months(SYSDATE, -12), 'YYYY'), 'dd-MON-yyyy')
    ELSE
      to_date('1-APR-'||to_char(SYSDATE, 'YYYY'), 'dd-MON-yyyy')
  END AS fiscal_year
FROM
  dual;

これにより、今日の日付に基づいて現在の会計年度を計算できます。

この計算をどのように簡略化または最適化できますか?

4

5 に答える 5

12
ADD_MONTHS(TRUNC(ADD_MONTHS(SYSDATE,-3),'YYYY'),3)
于 2010-04-21T04:46:58.327 に答える
0

おそらくこれ...

SELECT to_date('01/04/' ||
to_char(extract(YEAR FROM SYSDATE)
- CASE WHEN extract(MONTH FROM SYSDATE) BETWEEN 1 AND 4 THEN 1 ELSE 0 END),
'DD/MM/YYYY') FROM dual;

これは別のオプションだと思います...

SELECT add_months(trunc(SYSDATE) - extract(DAY FROM SYSDATE) + 1,
- (extract(MONTH FROM SYSDATE) + CASE
WHEN extract(MONTH FROM SYSDATE) <= 4 THEN 12 ELSE 0 END) + 4)
FROM dual;

他のオプションは、日付を返す関数として書き直すことです。または、to_char内のロジックのみが必要なため、現在の会計年度の年番号を返すことができれば、ロジックを簡略化できます。

于 2010-04-20T22:31:44.190 に答える
0
select T.USERNAME,T.CREATED,

CASE WHEN EXTRACT (MONTH FROM T.CREATED)>=4 AND EXTRACT (MONTH FROM T.CREATED)<=12 THEN 
TO_CHAR(EXTRACT (YEAR FROM T.CREATED))||'-'||TO_CHAR(EXTRACT (YEAR FROM T.CREATED)+1)
  WHEN EXTRACT (MONTH FROM T.CREATED)<4 THEN 
TO_CHAR(EXTRACT (YEAR FROM T.CREATED)-1)||'-'||TO_CHAR(EXTRACT (YEAR FROM T.CREATED)) ELSE NULL END FY
from sys.dba_users t WHERE T.USERNAME in ('101655','100149')

出力は次のようになります。

1   101655  14/01/2014 12:21:53 2013-2014
2   100149  05/05/2012 16:55:00 2012-2013
于 2014-06-03T05:23:11.783 に答える
0

TRUNC() は、さまざまなフォーマット マスクを使用して、日付に便利に適用できます。最も適切なtrunc(sysdate, 'yyyy')のは、年の最初の日です。したがって、これにより、現在の年の01-APRが得られます...

add_months(trunc(sysdate, 'yyyy'), 3)

そして、これは前年のその日付...

add_months(trunc(add_months(sysdate, -12), 'yyyy'), 3)

そう:

CREATE OR REPLACE VIEW FISCAL_YEAR_VW AS
WITH cte as 
    ( select add_months(trunc(sysdate, 'yyyy'), 3) as this_year
             , add_months(trunc(add_months(sysdate, -12), 'yyyy'), 3) as last_year
      from dual )
SELECT
  CASE
    WHEN SYSDATE >= cte.this_year THEN    
      cte.this_year
    ELSE
      cte.last_year
  END AS fiscal_year
FROM
  cte;

警告: このコードをまだテストする機会がなかったため、タイプミスが含まれている可能性があります。後でテストして、必要に応じて修正します。

于 2010-04-21T07:14:13.153 に答える
0

Oracle の TO_CHAR(date, 'Q') 機能は、会計カレンダーの計算に非常に便利です。以下のクエリは、'with' 句を使用して 2 つのものを構築します

  1. サンプル データ- test_dates テーブル。
  2. 会計_マップ- 暦四半期から会計カレンダーへの単純なマッピング。この例では、第 4 暦四半期は第 1 会計四半期 (10 月 1 日) です。

例:

with test_dates as (
 select sysdate + level * 80 test_date from dual connect by level < 11
),
fiscal_map as (
 select 1 cal, 2 fiscal from dual
 union
 select 2 cal, 3 fiscal from dual
 union
 select 3 cal, 4 fiscal from dual
 union
 select 4 cal, 1 fiscal from dual
)
select 
 test_date, 
 TO_CHAR(test_date, 'Q') cal_quarter, 
 fiscal_map.fiscal,
 (case when CAL < fiscal then 
     TO_CHAR(test_date, 'yyyy') + 0
     else TO_CHAR(test_date, 'yyyy') + 1
 end) FISCAL_YEAR
from test_dates, fiscal_map
where fiscal_map.cal = TO_CHAR(test_date, 'Q')
order by test_date

出力:

TEST_DT CAL_Q   FISCAL Q    FISCAL_YR
22-Jul-10   3   4   2010
10-Oct-10   4   1   2011
29-Dec-10   4   1   2011
19-Mar-11   1   2   2011
07-Jun-11   2   3   2011
26-Aug-11   3   4   2011
14-Nov-11   4   1   2012
02-Feb-12   1   2   2012
22-Apr-12   2   3   2012
11-Jul-12   3   4   2012
于 2010-05-04T05:00:59.627 に答える