2010-10-12 39 views
6

¿Hay alguna forma en Oracle que pueda extraer el año fiscal? Usé el script a continuación para sacar solo dos años fiscales. El rango de fechas de Mytable es de FY1998 a FY2009.Agrupar por año fiscal (Oracle)

SELECT 'FY2008' as FY, 
     Site, 
     COUNT(*) 
    FROM mytable 
    WHERE date >='10-OCT-2007' 
    AND date <'10-OCT-2008' 
GROUP BY site 

SELECT 'FY2008' as FY, 
     Site, 
     COUNT(*) 
    FROM mytable 
    WHERE date >='10-OCT-2008' 
    AND date <'10-OCT-2009' 
GROUP BY site 

Tirando dos año fiscal está bien, pero es demasiado repetitivo cuando se tira más de 10 el año fiscal.

Respuesta

8

Añadir 83 días de la fecha y trunca en año entero:

select 'FY'||TRUNC(date + 83, 'YYYY') as FY, Site, count(*) 
from mytable 
group by 'FY'||TRUNC(date + 83, 'YYYY'), site 
+0

1 justo lo que iba a sugerir. –

+0

+1 aunque usaría una sola 'Y' en vez de 4 e "intervalo '83' día" en lugar de solo 83. Pero TRUNC es mucho mejor que TO_CHAR aquí. –

+0

¿Por qué agrega 83 días? – Sun

1

algunas opciones:

Puede utilizar la función to_char aquí. Compruebe este enlace para obtener una explicación: http://www.techonthenet.com/oracle/functions/to_char.php

También puede intentar usar una declaración de caso

select case when date >='10-OCT-2007' and date <'10-OCT-2008' then 'FY08' 
      when date >='10-OCT-2008' and date <'10-OCT-2009' then 'FY09' 
      else 'Other' end as fiscal_year, count(*) 
    from mytable 
group by case when date >='10-OCT-2007' and date <'10-OCT-2008' then 'FY08' 
      when date >='10-OCT-2008' and date <'10-OCT-2009' then 'FY09' 
      else 'Other' end 

En última instancia, si usted tiene crear privilegios de tabla es posible que desee considerar la posibilidad de una tabla de fechas de búsqueda. Busque "dimensión de fecha" en las guías de almacenamiento de datos.

Por ejemplo:
Su mesa tendría fecha, date_desc, fiscal_year, etc ....

entonces se podría simplemente se unen y el grupo para el año fiscal, o cualquier otra cosa que desee.

2

Suponiendo Oracle 9i +, utilice una expresión CASE:

SELECT CASE 
      WHEN TO_CHAR(t.date,) = 10 AND EXTRACT(DAY FROM t.date) >= 10 THEN 
      'FY' || EXTRACT(YEAR FROM t.date) + 1 
      WHEN TO_CHAR(t.date,) > 10 THEN 
      'FY' || EXTRACT(YEAR FROM t.date) + 1 
      ELSE 
      'FY' || EXTRACT(YEAR FROM t.date) 
     END AS FY, 
     t.site, 
     COUNT(*) 
    FROM YOUR_TABLE t 
GROUP BY t.site, FY 
+0

¿Cuándo t.date es el 01 de noviembre? EXTRAER (MES DESDE t.date)> = 10 pero no EXTRAER (DÍA DESDE t.date)> = 10 – eumiro

+0

@eumiro: Buena captura, corregida. –

2

está completo y si, además de @eumiro respuesta. En países (como Australia) que tienen un año fiscal que va del 1 de julio al 30 de junio, puede reemplazar el 83 con .

0

Aquí es otra manera de determinar fácilmente el año fiscal de una fecha para los que es el año fiscal de julio a junio:

SELECT 'FY'||TO_CHAR(ROUND(your_date_here,'YEAR'),'YY') AS FY