none
SQL Funcion escalar para obtener mes RRS feed

  • Pregunta

  • Hola.

    Estoy intentando generar una función escalar para poder usarla en alguna otra consulta y solo mandar a llamar la función. La función que quiere hacer es para la obtención del año pero en letra.

    CREATE

    FUNCTIONGET_MES_LETRA(@monthid ASINT)


    RETURNS

    INT

    AS

    BEGIN


    DECLARE@MES ASINT


    SELECT@MES =SUBSTRING(@monthid,5,2)


    CASE

    WHEN@MES  =3 tHEN'Marzo'


    WHEN@MES  =6 tHEN'Junio'


    WHEN@MES  =9 tHEN'Spetiembre'


    WHEN@MES  =12 tHEN'Diciembre'


    END

    Esto lo estoy es que a partir de la variable monthid  INT = 201903 obtenga el numero del mes y eso lo transforme a letra, me podrían decir que estoy haciendo mal.

    Gracias


    Mgm

    jueves, 4 de julio de 2019 16:48

Respuestas

  • Hola Slafco:

    Ten muy en cuenta lo que te ha expresado José Diz.

    Si aún persistes en tu idea por los motivos que quieras.

    /* Con tu estrategia */
    CREATE FUNCTION GET_MES_LETRA(@monthid INT)
    RETURNS NVarchar(20)
    begin
    DECLARE @MES AS INT
    SELECT @MES =(select SUBSTRING(cast(@monthid as varchar(10)),5,2));
    
    Declare @MesEnLetra Nvarchar(10);
    Select @MesEnLetra = CASE @MES  WHEN 3 tHEN  'Marzo'
    					       WHEN 6 tHEN 'Junio'
    						  WHEN 9 tHEN 'Septiembre'
    						  WHEN 12 tHEN 'Diciembre'
    				END;
    return @mesEnLetra
    END

    Consumo

    select 
    dbo.GET_MES_LETRA(201903) as 'PrimerTrimestre'  ,
    dbo.GET_MES_LETRA(201906) as 'SegundoTrimestre' ,
    dbo.GET_MES_LETRA(201909) as 'TercerTrimestre'  ,
    dbo.GET_MES_LETRA(201912) as 'CuartoTrimestre'

    Salida

    Otra opción la tienes creando una función de tipo tabla, que será mucho más eficiente.

    CREATE FUNCTION GET_MES_LETRA_OPCION2
    (@monthid INT
    )
    RETURNS TABLE
    AS
         RETURN
         SELECT CASE SUBSTRING(CAST(@monthid AS VARCHAR(10)), 5, 2)
                    WHEN 3
                    THEN 'Marzo'
                    WHEN 6
                    THEN 'Junio'
                    WHEN 9
                    THEN 'Septiembre'
                    WHEN 12
                    THEN 'Diciembre'
                END AS MesEnLetra;
    GO

    Consumo 

    select 
    * from 
    dbo.GET_MES_LETRA_OPCION2(201903)

    Mismo resultado pero cruzándolo con una tabla.

    declare @valorMes Table (id int, mes int)
    insert into @valorMes (id, mes) 
    values
    (1,201903),
    (2,201906),
    (3,201909),
    (4,201912);
    
    select 
    * from @valorMes v
    cross apply
    dbo.GET_MES_LETRA_OPCION2(v.mes)

    Salida


    • Marcado como respuesta Slafco jueves, 4 de julio de 2019 21:10
    jueves, 4 de julio de 2019 20:32

Todas las respuestas

  • Deleted
    jueves, 4 de julio de 2019 17:33
  • Hola

    Si el valor de la variable es 201903 se tomara el primer caso y será 03 = Marzo

    201906 seria 06 = Juanio

    201907 seria 09 = Septiembre

    201912 seria 12 = Diciembre y asi… por cada trimestre


    Mgm

    jueves, 4 de julio de 2019 18:31
  • Deleted
    jueves, 4 de julio de 2019 18:41
  • Hola

    La subtracción del dato de la varaible ya lo tengo

    @monthid = 201903

    @MES = SUBSTRING (@monthid,5,2)

    Lo que tengo duda es como arma el case para cada mes, pues en mi query de arriba no me funciona.


    Mgm

    jueves, 4 de julio de 2019 18:54
  • Hola Slafco:

    Ten muy en cuenta lo que te ha expresado José Diz.

    Si aún persistes en tu idea por los motivos que quieras.

    /* Con tu estrategia */
    CREATE FUNCTION GET_MES_LETRA(@monthid INT)
    RETURNS NVarchar(20)
    begin
    DECLARE @MES AS INT
    SELECT @MES =(select SUBSTRING(cast(@monthid as varchar(10)),5,2));
    
    Declare @MesEnLetra Nvarchar(10);
    Select @MesEnLetra = CASE @MES  WHEN 3 tHEN  'Marzo'
    					       WHEN 6 tHEN 'Junio'
    						  WHEN 9 tHEN 'Septiembre'
    						  WHEN 12 tHEN 'Diciembre'
    				END;
    return @mesEnLetra
    END

    Consumo

    select 
    dbo.GET_MES_LETRA(201903) as 'PrimerTrimestre'  ,
    dbo.GET_MES_LETRA(201906) as 'SegundoTrimestre' ,
    dbo.GET_MES_LETRA(201909) as 'TercerTrimestre'  ,
    dbo.GET_MES_LETRA(201912) as 'CuartoTrimestre'

    Salida

    Otra opción la tienes creando una función de tipo tabla, que será mucho más eficiente.

    CREATE FUNCTION GET_MES_LETRA_OPCION2
    (@monthid INT
    )
    RETURNS TABLE
    AS
         RETURN
         SELECT CASE SUBSTRING(CAST(@monthid AS VARCHAR(10)), 5, 2)
                    WHEN 3
                    THEN 'Marzo'
                    WHEN 6
                    THEN 'Junio'
                    WHEN 9
                    THEN 'Septiembre'
                    WHEN 12
                    THEN 'Diciembre'
                END AS MesEnLetra;
    GO

    Consumo 

    select 
    * from 
    dbo.GET_MES_LETRA_OPCION2(201903)

    Mismo resultado pero cruzándolo con una tabla.

    declare @valorMes Table (id int, mes int)
    insert into @valorMes (id, mes) 
    values
    (1,201903),
    (2,201906),
    (3,201909),
    (4,201912);
    
    select 
    * from @valorMes v
    cross apply
    dbo.GET_MES_LETRA_OPCION2(v.mes)

    Salida


    • Marcado como respuesta Slafco jueves, 4 de julio de 2019 21:10
    jueves, 4 de julio de 2019 20:32
  • Hola Javier¡

    Con ese detalle me queda clarísimo.

    Gracias¡¡


    Mgm

    jueves, 4 de julio de 2019 21:12
  • "Las funciones escalares se vuelven ineficientes si el volumen de filas que se va a representar es alto."

    Cuáles son las alternativas para un mejor rendimiento?
    jueves, 4 de julio de 2019 21:19
  • Deleted
    jueves, 4 de julio de 2019 21:29