parent nodes: SQLapuntes
Conversion de variables
Para poder imprimir el contenido de variables que no sean cadenas hay que convertirlas antes en cadenas
CAST
DECLARE @i INT
SET @i = 10
PRINT CAST( @i AS VARCHAR )
CONVERT
Es una función que nos permite, entre otras cosas, pasar una fecha a texto con un formato adecuado.CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Los formatos para España y los números de estilo asociados son:
| FORMATO | Año 2 dígitos | Año 4 dígitos | Ejemplos |
| Italian | 5 | 105 | dd-mm-aa y dd-mm-aaaa |
| British/French | 8 | 108 | dd/mm/aa y dd/mm/aaaa |
DECLARE @FECHA DATETIME
DECLARE @FECHA_CORTA VARCHAR(8) -- dd/mm/aa
DECLARE @FECHA_LARGA VARCHAR(10) -- dd/mm/aaaa
SET @FECHA = '4/05/98'
SET @FECHA_CORTA = CONVERT(VARCHAR(8), @FECHA, 3)
SET @FECHA_LARGA = CONVERT(VARCHAR(10), @FECHA, 103)
PRINT 'Hoy es ' + @FECHA_CORTA + ' y también ' + @FECHA_LARGA
Ordenar fechas convertidas
Al ordenar fechas convertidas de esta forma lo hará mal pues ordenará de forma de varchar, es decir primero los ceros, luego los unos, etc por el primer carácter, se soluciona ordenando por la conversión: CONVERT(DATETIME, @FECHA, 103)
Por lo tanto en el SELECT hay que hacer la conversión en formato VARCHAR, en el ORDER BY hay que ponerlo en formato DATETIME.
Por ejemplo: SELECT F.NUMERO AS 'NUM FACTURA', CONVERT(VARCHAR(10), F.FECHA, 103) AS 'FECHA'
FROM FACTURACION F
ORDER BY CONVERT(DATETIME, F.FECHA, 103) DESC
Otro ejemplo real (para sacar la información de cargas dinámicas de proveedores):SELECT C.NIF AS 'NIF PROV', C.NOMBRE AS 'NOMBRE PROV', C.DOMICILIO AS DIRECCION, C.COD_POSTAL, C.ID_PROVINCIA, P.POBLACION,
F.NUMERO AS 'NUM FACTURA', S.SERIE, S.DESCRIPCION AS 'SERIE_NOMBRE', CONVERT(VARCHAR(10), F.FECHA, 103) AS FECHA, F.BASE_IVA AS 'BASE SUJETA A IVA',
F.BASE_SIN_IVA AS 'BASE NO IVA', F.CUOTA_IVA, F.TOTAL_BRUTO, F.TOTAL_FACTURA,
ROUND(F.TOTAL_APAGAR * 1000000, 0) as 'A pagar',
ROUND(ISNULL(SUM(LA.CANTIDAD), 0) * 1000000, 0) as 'Pagado'
FROM FACTURACION F INNER JOIN
SERIE S ON F.SERIE = S.ID_SERIE LEFT OUTER JOIN
LINEAPUNTE LA ON F.ID_APUNTE = LA.IDCOBRO LEFT OUTER JOIN
CLIENTES C ON F.ID_CLIENTE = C.ID_CLIENTES LEFT OUTER JOIN
POBLACIONES P ON C.ID_POBLACION = P.ID_POBLACIONES AND C.ID_PROVINCIA = P.ID_PROVINCIAS
WHERE (F.FECHA <= '30/09/2014') AND (F.COBRO_DIRECTO <> 1) AND (LA.DH = 'H' OR LA.DH IS NULL) AND (S.VEN_COM = 'C')
GROUP BY C.NIF, C.NOMBRE, C.DOMICILIO, C.COD_POSTAL, C.ID_PROVINCIA, P.POBLACION, F.NUMERO, S.SERIE, S.DESCRIPCION, F.FECHA, F.BASE_IVA,
F.BASE_SIN_IVA, F.CUOTA_IVA, F.TOTAL_BRUTO, F.TOTAL_FACTURA, F.TOTAL_APAGAR
HAVING (ABS(ROUND(F.TOTAL_APAGAR * 1000000, 0)) <> ABS(ROUND(ISNULL(SUM(LA.CANTIDAD), 0) * 1000000, 0)))
ORDER BY CONVERT(DATETIME, F.FECHA, 103) DESC
Convertir números en formato USA a números en formato ES
Es útil para exportar y después importar en excel. No es necesario para usar en código fuente de cualquier otro lenguaje.
SQL deja los números con separador decimal USA '.' (punto), al importar en excel no lo trata como número sino como texto.
FORMAT(valor_a_convertir, Formato, local)
Se puede usar para fechas y para números.
El local de España es 'es-es'
El formato es mejor dejar 'G' (generic) ya que los demás ponen punto de separador de miles (y el excel no le gusta ese punto) o bien punto+divisa, ambos convierten al número en texto, así que mejor dejar "G" y que luego el excel quite los decimales sobrantes de forma automática.
SELECT FORMAT(1234.1234560000, 'N', 'ES-ES') -- 1.234,12 Mal: separador de miles. Mal: redondea a 2 decimales
SELECT FORMAT(1234.1234560000, 'G', 'ES-ES') -- 1234,1234560000 Bien la ristra de ceros se quita automáticamente en el excel
SELECT FORMAT(1234.1234560000, 'C', 'ES-ES') -- 1.234,12 € Mal: separador de miles, divisa y redondea a 2.