회계연도로 날짜 잘라내기
다음 데이터베이스 보기에서는 날짜를 회계 연도(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;
이를 통해 오늘 날짜를 기준으로 현재 회계연도를 계산할 수 있습니다.
이 계산을 어떻게 단순화하거나 최적화할 수 있습니까?
ADD_MONTHS(TRUNC(ADD_MONTHS(SYSDATE,-3),'YYYY'),3)
어쩌면 이건...
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 내의 논리만 필요하므로 현재 회계연도의 연도 번호를 반환할 수 있다면 논리를 단순화할 수 있습니다.
TRUN()은 다른 형식의 마스크를 사용하여 날짜에 유용하게 적용할 수 있습니다.가장 중요한 건trunc(sysdate, 'yyyy')
1년의 첫 날을 줍니다.그럼 올해의 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;
주의: 아직 이 코드를 테스트할 기회가 없었기 때문에 오타가 포함되어 있을 수 있습니다.나중에 테스트해보고 필요하면 수정하겠습니다.
저는 오라클의 TO_CHAR(날짜, 'Q') 기능이 회계 캘린더 계산에 매우 유용하다고 생각합니다.아래 쿼리는 'with' 절을 사용하여 두 가지를 구축합니다.
- 표본 데이터 - test_dates 표
- fiscal_map - 달력 분기를 재정 달력에 간단하게 매핑할 수 있습니다.이 예제에서 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
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
언급URL : https://stackoverflow.com/questions/2678869/truncate-date-to-fiscal-year
'programing' 카테고리의 다른 글
피벗 테이블에 가중 평균을 추가하는 방법은 무엇입니까? (0) | 2023.10.19 |
---|---|
각도 JS - 각도.각도.각도 - 객체의 키를 얻는 방법은? (0) | 2023.10.19 |
COM, COM+, DCOM, 어디서부터 시작할까요? (0) | 2023.10.19 |
IXml Serializable을 구현하는 적절한 방법은 무엇입니까? (0) | 2023.10.19 |
개체를 이미 정의된 변수로 구조화하는 방법은 무엇입니까? (0) | 2023.10.19 |