Oasis

viernes, enero 27, 2006

SQL: Replicate

Hace unos dias, resolviendo un problema que traiamos en el trabajo usamos la funcion REPLICATE. Lo que pasaba era que de una fecha necesitabamos solamente el año y el mes ( YYYYMM ), esto porque el reporte era por periodos. Buenos, entonces dijimos hay que sacar el año y el mes y los concatenamos no???

Pero la funcion MONTH() regresa un int, asi que :

1) Si hacemos esto:
SELECT YEAR('1/30/2005 5:40:58 PM') + MONTH('1/30/2005 5:40:58 PM')

Lo que pasa es que nos suma 2005 + 1 = 2006 y pues claro, esto no es lo que buscamos.

2) Entonces pensamos, hay que convertirlas a char:
SELECT CAST(YEAR('1/30/2005 5:40:58 PM') AS CHAR(4)) + CAST(MONTH('1/30/2005 5:40:58 PM') AS CHAR(2))

Pero ahi nos topamos con otro problema, nos regreso '20051' debido a que la funcion MONTH() solo regreso un '1' y no un '01' como hubieramos deseado ('200501').

Entonces recorde que habia buscado una vez una funcion para ponerle ceros a la izquierda a unos cheques, pero no me acordaba ni cual era ni donde la habia usado, asi que tarde buen rato buscando hasta que la encontre.

3) Usamos el REPLICATE() para ponerle un cero a la izquierda al mes y concatenarlo:
SELECT CAST(YEAR('1/30/2005 5:40:58 PM') AS CHAR(4)) + REPLICATE('0',2-LEN(CAST(MONTH('1/30/2005 5:40:58 PM') AS CHAR(2))))+ CAST(MONTH('1/30/2005 5:40:58 PM') AS CHAR(2))

pero, porque puse ese 2- tan grandote? Ah pues porque es muy importante que lo pongamos ya que ahi estamos diciendole el tamaño de longitud de la cadena. Es que el replicate lo que hace es repetir una cadena el numero de veces que tu le digas, por lo tanto lo que hicimos fue repetir el cero 1 vez ( 2 - 1).

2-1? Si, el 2 yo lo puse y el 1 sale de la longitud del mes, osea 1. Y que pasaria con meses de 2 digitos? pues 2-LEN(MONTH('11/30/2005 5:40:58 PM')) es 2-0 = 0, y pues no pondra ningun cero y solo concatenaremos el mes de dos digitos.


Bueno el punto es que el REPLICATE() repite cadenas las veces que le digas y si necesitas ponerle ceros a la izquierda a alguna cadena pues asi lo puedes hacer.

Otro ejempo:
SELECT REPLICATE('0', 10-LEN(270)) + CAST(270 AS CHAR(10))

5 Comments:

  • Chido truco. Con eso puedes hacer una función PAD... muy interesante.

    By Blogger Carlos Madrigal, at 11:59 a. m.  

  • Luego pense que talvez si creamos una variable tipo periodo hubieramos podido evitar esto pero no habia tiempo para ver como crear variables, etc, etc.

    Pero voy a investigarlo y lo que encuentre lo pondre aqui.

    By Blogger Luis Enrique Morales, at 2:32 p. m.  

  • Estuvo bueno la explicacion del Replicate en SQL. Vemos

    By Blogger chele tobar, at 12:01 a. m.  

  • gracias andaba buscando esto hace rato

    By Anonymous Anónimo, at 12:59 p. m.  

  • Y si tan solo hubiesen hecho esto:

    select convert(varchar(6),@fecha,112)

    Donde @fecha es de tipo datetime, te retornaria '200501'

    By Anonymous Antony, at 8:33 a. m.  

Publicar un comentario

<< Home