Warning: preg_match(): Unknown modifier 'b' in /mnt/datadisk/www/src/Controllers/PostController.php on line 206 SQL Server - Usando la Función FORMAT() para Aplicar Máscaras y Formatos a Números y Fechas — Dirceu ResendeSaltar al contenido
En este post de hoy me gustaría mostraros la función T-SQL FORMAT, disponible desde SQL Server 2012, y que hasta el día de hoy pocas personas utilizan a diario para formatear fechas y números.
Cuando analizo consultas, funciones y Procedimientos Almacenados, veo que aún hoy muchos desarrolladores insisten en usar CAST, CONVERT y concatenaciones para formatear fechas y números, incluso con una función específica para eso. Después de leer esta publicación, espero que comprendas cómo usar esta función y comiences a simplificar tus códigos T-SQL con ella.
¿Quién nunca ha necesitado completar un número con 0 a la izquierda para generar un diseño? ¿Formatear una fecha? ¿Extraer solo la hora de una fecha? Existen numerosas situaciones en las que la función FORMATO es útil.
Formatear datos numéricos
Formato predefinido
De uso más sencillo, las funciones predefinidas permiten formatear valores utilizando máscaras ya definidas por defecto en SQL Server, como “C” para moneda.
Formatos más utilizados
SELECT
FORMAT(123456.99, 'C'), -- Formato de moeda padrão
FORMAT(-123456.987654321, 'C4'), -- Formato de moeda com 4 casas decimais
FORMAT(123456.987654321, 'C2', 'pt-br') -- Formato de moeda forçando a localidade pra Brasil e 2 casas decimais
SELECT
FORMAT(123456.99, 'D'), -- Formato de número inteiro com valores numeric (NULL)
FORMAT(123456, 'D'), -- Formato de número inteiro
FORMAT(-123456, 'D4'), -- Formato de número inteiro com valores negativos
FORMAT(123456, 'D10', 'pt-br'), -- formato de número inteiro com tamanho fixo em 10 caracteres
FORMAT(-123456, 'D10', 'pt-br') -- formato de número inteiro com tamanho fixo em 10 caracteres
SELECT
FORMAT(123456.99, 'E'), -- Formato de notação científica
FORMAT(123456.99, 'E4') -- Formato de notação científica e 4 casas decimais de precisão
SELECT
FORMAT(1, 'P'), -- Formato de porcentagem
FORMAT(1, 'P2'), -- Formato de porcentagem com 2 casas decimais
FORMAT(0.91, 'P'), -- Formato de porcentagem
FORMAT(0.005, 'P4') -- Formato de porcentagem com 4 casas decimais
SELECT
FORMAT(255, 'X'), -- Formato hexadecimal
FORMAT(512, 'X8') -- Formato hexadecimal fixando o retorno em 8 caracteres
Ejemplos
Otros formatos
SELECT
FORMAT(123456.99, 'F'), -- Formato de número
FORMAT(123456.99, 'F4') -- Formato de número com 4 casas decimais
SELECT
FORMAT(123456.99, 'G'), -- Formato de número compacto
FORMAT(123456.99, 'G4'), -- Formato de número (tenta forçar o número com 4 caracteres)
FORMAT(123456.99, 'G20') -- Formato de número com tamanho máximo de 10 caracteres
SELECT
FORMAT(123456.99, 'N'), -- Formato de número genérico
FORMAT(123456.99, 'N4') -- Formato de número genérico fixando 4 casas decimais
Ejemplos
Formato personalizado
Llenar un número con un cero a la izquierda
Formatear un número para moneda brasileña
Función utilizada en este ejemplo:
CREATE FUNCTION fncConverte_Moeda_Real (
@Numero VARCHAR(40)
)
RETURNS VARCHAR(40)
AS
BEGIN
DECLARE @Contador INT
DECLARE @Pontos INT
DECLARE @CasasVirgula INT
DECLARE @Parte1 VARCHAR(40)
DECLARE @Parte2 VARCHAR(40)
SET @CasasVirgula = (LEN(SUBSTRING(@Numero, CHARINDEX('.', @Numero) + 1, LEN(@Numero))))
IF @CasasVirgula > 2
SET @Numero = (SUBSTRING(@Numero, 1, (CHARINDEX('.', @Numero)) + 2))
IF CHARINDEX('.', @Numero) <> 0 BEGIN
SET @Numero = REPLACE(@Numero, '.', ',')
IF LEN(SUBSTRING(@Numero, CHARINDEX(',', @Numero) + 1, 2)) = 1
SET @Numero = @Numero + '0'
END
ELSE
SET @Numero = @Numero + ',00'
SET @Contador = (CHARINDEX(',', @Numero) - 1)
SET @Pontos = @Contador / 3
WHILE @Pontos <> 0 BEGIN
SET @Contador = @Contador - 3
SET @Parte2 = (SUBSTRING(@Numero, @Contador + 1, LEN(@Numero)))
SET @Parte1 = (SUBSTRING(@Numero, 1, (CHARINDEX(@Parte2, @Numero) - 1)))
SET @Numero = @Parte1 + '.' + @Parte2
SET @Pontos = @Pontos - 1
END
IF (SUBSTRING(@Numero, 1, 1)) = '.'
SET @Numero = (SUBSTRING(@Numero, 2, LEN(@Numero)))
SET @Numero = 'R$ ' + @Numero
RETURN @Numero
END
Otros ejemplos:
SELECT
-- Formato de moeda brasileira (manualmente)
FORMAT(123456789.9, 'R$ ###,###,###,###.00'),
-- Utilizando sessão (;) para formatar valores positivos e negativos
FORMAT(123456789.9, 'R$ ###,###,###,###.00;-R$ ###,###,###,###.00'),
-- Utilizando sessão (;) para formatar valores positivos e negativos
FORMAT(-123456789.9, 'R$ ###,###,###,###.00;-R$ ###,###,###,###.00'),
-- Utilizando sessão (;) para formatar valores positivos e negativos
FORMAT(-123456789.9, 'R$ ###,###,###,###.00;(R$ ###,###,###,###.00)'),
-- Formatando porcentagem com 2 casas decimais
FORMAT(0.9975, '#.00%'),
-- Formatando porcentagem com 4 casas decimais
FORMAT(0.997521654, '#.0000%'),
-- Formatando porcentagem com 4 casas decimais
FORMAT(123456789.997521654, '#.0000%'),
-- Formatando porcentagem com 2 casas decimais e utilizando sessão (;)
FORMAT(0.123456789, '#.00%;-#.00%'),
-- Formatando porcentagem com 2 casas decimais e utilizando sessão (;)
FORMAT(-0.123456789, '#.00%;-#.00%'),
-- Formatando porcentagem com 2 casas decimais e utilizando sessão (;)
FORMAT(-0.123456789, '#.00%;(#.00%)')
Resultado:
Formatear fechas
Formato predefinido
Formatos más comunes
SET LANGUAGE 'English'
SELECT
FORMAT(GETDATE(), 'd'), -- Padrão de data abreviada.
FORMAT(GETDATE(), 'D'), -- Padrão de data completa.
FORMAT(GETDATE(), 'R'), -- Padrão RFC1123
FORMAT(GETDATE(), 't'), -- Padrão de hora abreviada.
FORMAT(GETDATE(), 'T') -- Padrão de hora completa.
SET LANGUAGE 'Brazilian'
SELECT
FORMAT(GETDATE(), 'd'), -- Padrão de data abreviada.
FORMAT(GETDATE(), 'D'), -- Padrão de data completa.
FORMAT(GETDATE(), 'R'), -- Padrão RFC1123
FORMAT(GETDATE(), 't'), -- Padrão de hora abreviada.
FORMAT(GETDATE(), 'T') -- Padrão de hora completa.
SELECT
-- Formato de data típico do Brasil
FORMAT(GETDATE(), 'dd/MM/yyyy'),
-- Formato de data/hora típico dos EUA
FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss.fff'),
-- Exibindo a data por extenso
FORMAT(GETDATE(), 'dddd, dd \d\e MMMM \d\e yyyy'),
-- Exibindo a data por extenso (forçando o idioma pra PT-BR)
FORMAT(GETDATE(), 'dddd, dd \d\e MMMM \d\e yyyy', 'pt-br'),
-- Exibindo a data/hora, mas zerando os minutos e segundos
FORMAT(GETDATE(), 'dd/MM/yyyy HH:00:00', 'pt-br')
2009-06-15T01:45:30 (arr hh: mm t) -> llegar 01:45 a
Formatear números y fechas antes de SQL Server 2012
Ahora que has visto lo simple y rápido que es formatear números y fechas usando la función FORMAT nativa, es incluso difícil querer volver a formatear este tipo de datos manualmente, ¿verdad?
Desafortunadamente, la función FORMATO se introdujo en SQL Server 2012, es decir, en las versiones 2005 y 2008, todavía tendrá que utilizar las formas tradicionales (costosas y laboriosas) de formatear fechas y números. O no.
Para quienes tienen un proyecto de base de datos en su instancia (también conocido como SQLCLR), pueden implementar fácilmente 2 funciones muy similares (prácticamente iguales) a la función FORMAT, permitiéndole formatear datos fácilmente usando estas funciones, incluso en las versiones 2005 y 2008 de SQL Server.
Vea cómo el uso es prácticamente el mismo que el de la función FORMATO (no implementé el tercer parámetro – cultura):
Tenga en cuenta que tanto los formatos predefinidos como los formatos personalizados permanecen sin cambios usando la función CLR. Esto sucede porque la función FORMAT usa internamente la misma función de C# que usé en estas funciones SQLCLR.
código fuente fncFormata_Datetime
using System.Data.SqlTypes;
using System.Globalization;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString fncFormata_Datetime(SqlDateTime Dt_Referencia, SqlString Ds_Mascara)
{
return Dt_Referencia.IsNull ? SqlString.Null : Dt_Referencia.Value.ToString(Ds_Mascara.Value, new CultureInfo("pt-BR"));
}
};
Cómo formatear números con el CLR
Ejemplos con formatos estándar
Ejemplos con formatos personalizados
código fuente fncFormata_Numero
using System.Data.SqlTypes;
using System.Globalization;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString fncFormata_Numero(SqlDouble Ds_String, SqlString Ds_Formato)
{
if (Ds_String.IsNull)
return SqlString.Null;
return Ds_Formato.IsNull ? Ds_String.Value.ToString(CultureInfo.InvariantCulture) : Ds_String.Value.ToString(Ds_Formato.Value, CultureInfo.CreateSpecificCulture("pt-br"));
}
}
¡Eso es todo, amigos!
Espero que empieces a utilizar más la función FORMAT en tu vida diaria (cuando sea necesario) y si estás utilizando las versiones 2005 o 2008 de SQL Server, debes saber que es posible simular el comportamiento de esta función utilizando SQLCLR.
Comentários (0)
Carregando comentários…