2015-11-26 2 views
1

Я не могу найти простой SQL-код, не вникая в PL SQL, чтобы всегда приносить текущий финансовый год в этом случае 01-04-2015 для sysdate. Я хочу, чтобы это всегда обновлялось автоматически, поэтому, когда наступает следующий финансовый год в 01/04/2016, он будет приносить все, что удерживается с этой даты, всякий раз, когда выполняется отчет.Текущий финансовый год для sysdate

Если кто-то может пролить свет на меня. благодаря

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

Вы хотите создать даты от 01-04-2015 до текущей даты? – Buddi

+0

Да для этого текущего финансового периода это будет 01-04-2015, но я не хочу указывать эту дату, но задавался вопросом, могу ли я использовать функцию для сбора первой даты и только 4-го месяца, используя некоторую функцию – abs786123

+0

@ abs786123 Используйте простое выражение 'CASE' для проверки текущей даты и получения желаемого результата. Вы должны предоставить некоторые примеры данных и показать желаемый результат. По крайней мере, создайте SQL-скрипт. –

ответ

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 
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; 
0

Спасибо, следующие работали! add_months (TRUNC (SYSDATE, 'год'), 3) И SYSDATE

поблагодарить всех вас за ваш вклад :)

+0

Он не будет работать, если текущая дата находится между январем и мартом. – MT0

+0

Пожалуйста, не добавляйте «Спасибо» в качестве ответа, вместо этого повышайте/принимайте ответ, который вам помог. И если вы хотите, вы можете прокомментировать ответ, который вам помог. Секция ответа должна быть только для отправки ответов. Прочтите [Stack Overflow tour] (http://stackoverflow.com/tour), чтобы понять, как работает этот сайт. Всего наилучшего! –

+0

Ты немного там. См. Мой ответ за аналогичный, но рабочий подход. –

0

REPAIR_CURRENT.REP_RAISED_DATE МЕЖДУ '01 -APR-2015' И SYSDATE

Во-первых, '01-APR-2015' не является ДАТА это строка. Вы должны всегда использовать TO_DATE наряду с правильной моделью формата в явно преобразовать строки в ДАТЫ. Или используйте литерал ANSI Date, так как вы не связаны с временной частью. Он использует фиксированный формат '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 

В основном, SYSDATE >= ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), 3), чтобы проверить SYSDATE ли больше, чем 1-APR из тока да г. И, SYSDATE < ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), 15) должен проверить, находится ли он между JAN и MARCH от в следующем году.

Например,

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 
+0

Вы хотите '> =' а не '>', а 'CASE' не имеет условия« ELSE », поэтому он никогда не вернет никаких результатов, если текущая дата находится между январем и мартом. – MT0

+0

Обновлен рабочим примером и объяснением. –

+0

'SYSDATE MT0

1

Это работает для любой даты:

REPAIR_CURRENT.REP_RAISED_DATE 
    BETWEEN Add_Months(Trunc(Add_Months(sysdate,-3),'YYYY'),3) 
     AND Sysdate 

В основном, вычесть три месяца hs, усечь до года и добавить три месяца назад.

Чтобы просто получить финансовый год на дату, используйте:

Extract(Year from Add_Months(Trunc(Add_Months(sysdate,-3),'YYYY'),3)) 
Смежные вопросы