2010-04-20 32 views
10

Quan điểm cơ sở dữ liệu sau truncates ngày sang năm tài chính (01 tháng 4):Truncate ngày đến năm tài chính

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; 

này cho phép chúng ta tính toán năm tài chính hiện tại dựa trên ngày hôm nay.

Cách tính toán này có thể được đơn giản hóa hoặc tối ưu hóa?

Trả lời

10
ADD_MONTHS(TRUNC(ADD_MONTHS(SYSDATE,-3),'YYYY'),3) 
+0

Rực rỡ. Cảm ơn bạn. –

0

Có lẽ đây ...

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; 

Tôi đoán đây là một tùy chọn ...

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; 

tùy chọn khác được viết lại như một hàm trả về một ngày, hoặc logic có thể được đơn giản hóa nếu bạn chỉ có thể trả về số năm cho năm tài chính hiện tại vì bạn chỉ cần logic trong phạm vi to_char.

+0

Truy vấn kết quả khác nhau. Mã bạn trình bày trả về 2009-04-01 cho ngày hôm nay. Nó sẽ trở lại 2010-04-01. –

0

TRUNC() có thể được áp dụng hữu ích cho các ngày, với các mặt nạ định dạng khác nhau. Hầu hết, trunc(sysdate, 'yyyy') cho chúng ta ngày đầu tiên của năm. Vì vậy, đây sẽ cho chúng ta những 01-tháng tư của năm nay ...

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

và điều này ngày đó của năm trước ...

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

Vì vậy:

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; 

báo trước: Tôi chưa có cơ hội để kiểm tra mã này vì vậy nó có thể chứa lỗi chính tả. Tôi sẽ kiểm tra nó sau và sửa nó nếu cần thiết.

0

Tôi tìm thấy tính năng TO_CHAR (ngày, 'Q') của oracle rất hữu ích để tính toán lịch tài chính. Truy vấn bên dưới sử dụng mệnh đề 'with' để tạo hai thứ

  1. Dữ liệu mẫu - bảng test_dates.
  2. financial_map - một bản đồ đơn giản của các khu lịch cho lịch tài chính của bạn. Trong ví dụ này, quý 4 dương lịch là quý tài chính thứ nhất (ngày 1 tháng 10).

Ví dụ:

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 

Output:

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 
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') 

Output sẽ là:

1 101655 14/01/2014 12:21:53 2013-2014 
2 100149 05/05/2012 16:55:00 2012-2013 
Các vấn đề liên quan