2012-07-11 12 views
8

que tengo este ejemplo de datos:SQL Grupo A - registros de conteo al mes/año, el error de inserción - NO AL MES VÁLIDO

Country | Members | Joined 
USA  | 250  | 1/1/2012 
USA  | 100  | 1/8/2012 
Russia | 75  | 1/20/2012 
USA  | 150  | 2/10/2012 

Cuando consultar estos datos me gustaría agregar todos los registros de una mes dado El resultado de la consulta se vería así:

Country | Members | Joined 
USA  | 350  | 1/2012 
Russia | 75  | 1/2012 
USA  | 150  | 2/2012 

Como selecto que es bastante simple:

select country, count(*) as members , to_char(trunc(joined), 'MM-YYYY') 
from table 
group by country, to_char(trunc(joined), 'MM-YYYY') 

esa consulta me dará datos en el formato que quiero, sin embargo, mi problema es que cuando vaya a insertar eso en una nueva tabla dinámica Obtengo un error porque to_char() en la instrucción select se está colocando en una columna DATETIME (error: ORA-01843 - no es un mes válido)

Cuando cambio el to_char() en la selección para to_date(), todavía no funciona (mismo error, ORA-01843 - no es un mes válida):

select country, count(*) as members, to_date(trunc(joined), 'MM-YYYY') 
from table 
group by country, to_date(trunc(joined), 'MM-YYYY') 

¿Alguna sugerencia sobre cómo modificar esta consulta de tal manera que pueda insertar el resultado en una nueva tabla cuya "unido" la columna es de tipo DATETIME?

¡gracias de antemano por cualquier consejo/sugerencia/comentario!

Respuesta

14

Puede hacer algo como to_date('01/'||trunc(joined), 'DD/MM/YYYY'), que primero lo convertiría en una fecha válida. Sólo tiene que decidir si va a utilizar el primer o el último día del mes (último es más complicado)

Otra opción es utilizar la función EXTRACTO:

select country, count(*) as members, EXTRACT(MONTH FROM joined) as mn, EXTRACT(YEAR FROM JOINED) as yr,MIN(JOINED) as dt 
from table 
group by country, EXTRACT(MONTH FROM joined), EXTRACT(YEAR FROM JOINED) 

y después de eso, usted podría simplemente seleccione la columna dt e insértela

+0

En mi cabeza esto era exactamente lo que estaba tratando de descubrir. ¡muchas gracias! –

5

Debe utilizar la función trunc para truncar la fecha al primero del mes. Eso elimina la conversión de la fecha a una cadena y la necesidad de convertir la cadena a una fecha.

select country, 
     count(*) as members , 
     trunc(joined, 'MM') 
    from table 
group by country, 
      trunc(joined, 'MM') 
+0

buena sugerencia, investigaré esto. Agradezco tus comentarios –

Cuestiones relacionadas