2011-07-21 16 views
11

Quiero almacenar solo el mes y el año en el tipo de datos de Oracle.Oracle Sql obtiene solo mes y año en el tipo de datos de fecha

Tengo una fecha como '01 -FEB-2010 'almacenada en una columna llamada time_period.

Para obtener únicamente el mes y año escribí una consulta como

select to_char(time_period,'MON-YYYY') from fact_table; 

voy el resultado como 'FEB-2010', que está bien, pero el único problema es que es en el tipo de datos varchar.

Así que lo hice como

select to_date(to_char(time_period,'MON-YYYY'),'MON-YYYY') from fact_table 

y consigo 01-FEB-2010. No es posible almacenar solo FEB-2010 en la fecha tipo de datos

+1

Oracle no almacena las fechas en la representación de caracteres (es decir, '01 -FEB-2010 'o' FEB-2010 ', estos son de hecho solo una forma de mostrar la fecha por una GUI), se almacena como datos de bytes simples. ¿Cuál es el problema que estás teniendo?El formato predeterminado definido por 'NLS_DATE_FORMAT' – Chandu

Respuesta

5

"FEB-2010" no es una fecha, por lo que no tendría mucho sentido almacenarla en una columna de fecha.

Siempre puede extraer la parte de cadena que necesita, en su caso "MON-YYYY" utilizando la lógica TO_CHAR que mostró anteriormente.

Si se trata de una tabla DIMENSIÓN en un entorno Almacén de datos y desea incluirlas como columnas separadas en la tabla Dimensión (como atributos de Datos), deberá almacenar el mes y el Año en dos columnas diferentes, con tipos de datos apropiadas ...

ejemplo ..

Month varchar2(3) --Month code in Alpha.. 
Year NUMBER  -- Year in number 

or 

Month number(2) --Month Number in Year. 
Year NUMBER  -- Year in number 
17

solución más fácil es crear la columna usando el tipo de datos correcto: FECHA

Por ejemplo:

  1. Crear una tabla:

    crear test_date mesa (fecha mydate);

  2. Insertar fila:

    inserción en valores test_date (to_date ('01 -01' -2011, '')-mm-aaaa dd);

Para obtener el mes y el año, hacen de la siguiente manera:

select to_char(mydate, 'MM-YYYY') from test_date; 

Su resultado será como sigue: 01-2011

Otra función interesante de utilizar es "EXTRACTO"

select extract(year from mydate) from test_date; 

Esto le devolverá: 2011

-1
SELECT to_char(to_date(month,'yyyy-mm'),'Mon yyyy'), nos 
FROM (SELECT to_char(credit_date,'yyyy-mm') MONTH,count(*) nos 
     FROM HCN 
     WHERE TRUNC(CREDIT_dATE) BEtween '01-jul-2014' AND '30-JUN-2015' 
     AND CATEGORYCODECFR=22 
     --AND CREDIT_NOTE_NO IS NOT NULL 
     AND CANCELDATE IS NULL 
GROUP BY to_char(credit_date,'yyyy-mm') 
ORDER BY to_char(credit_date,'yyyy-mm')) mm 

Salida:

Jul 2014  49 
Aug 2014  35 
Sep 2014  57 
Oct 2014  50 
Nov 2014  45 
Dec 2014  88 
Jan 2015  131 
Feb 2015  112 
Mar 2015  76 
Apr 2015  45 
May 2015  49 
Jun 2015  40 
Cuestiones relacionadas