Hola, chicos,
Todo está bien ?

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.

Resultado:

Tabla completa:

Formato

Descripción

Ejemplos

"d"

Patrón de fecha abreviado.

Más información: Especificador de formato corto de fecha ("d").

2009-06-15T13:45:30 -> 15/6/2009 (es)

2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)

2009-06-06/2009/15 (ja-JP) -> 15T13:45:30

"D"

Patrón de fecha completa.

Más información:Especificador de formato de fecha completa ("D").

2009-06-15T13:45:30 -> lunes 15 de junio de 2009 (es-US)

2009-06-15T13:45:30 -> 15 de junio de 2009. (ru-RU)

2009-06-15T13:45:30 -> lunes, 15 de junio de 2009 (de-DE)

"F"

Patrón completo de fecha/hora (hora abreviada).

Más información: Especificador de formato de fecha completa y hora abreviada ("f").

2009-06-15T13:45:30 -> lunes 15 de junio de 2009 13:45 (en-US)

2009-06-15T13:45:30 -> 15 de junio de 2009 13:45 (sv-SE)

2009-06-15T13:45:30 -> Δευτέρα, 15 de noviembre de 2009 1:45 μμ (el-GR)

"F"

Patrón completo de fecha/hora (tiempo completo).

Más información: Especificador de formato de fecha completa y hora completa ("F").

2009-06-15T13:45:30 -> lunes 15 de junio de 2009 13:45:30 (en-US)

2009-06-15T13:45:30 -> 15 de junio de 2009 13:45:30 (sv-SE)

2009-06-15T13:45:30 -> Δευτέρα, 15 de noviembre de 2009 1:45:30 μμ (el-GR)

"gramo"

Estándar general de fecha/hora (hora abreviada).

Más información: Especificador de formato corto general de fecha y hora ("g").

2009-06-15T13:45:30 -> 15/6/2009 13:45 (en-US)

2009-06-15T13:45:30 --> 15/06/2009 13:45 (es-ES)

2009-06-15T13:45:30 -> 15/6/2009 13:45 (zh-CN)

"GRAMO"

Patrón general de fecha/hora (tiempo completo).

Más información: Especificador de formato general de fecha y hora ("G").

2009-06-15T13:45:30 -> 15/6/2009 13:45:30 (en-US)

2009-06-15T13:45:30 --> 15/06/2009 13:45:30 (es-ES)

2009-06-15T13:45:30 -> 15/6/2009 13:45:30 (zh-CN)

"M", "m"

Patrón mes/día.

Más información: Especificador de formato de mes ("M", "m").

2009-06-15T13:45:30 -> 15 de junio (en-US)

2009-06-15 -> 15T13:45:30. juni (da-DK)

2009-06-15T13:45:30 -> 15 de junio (id-ID)

"O", "o"

Patrón de fecha/hora de ida y vuelta.

Más información: Especificador de formato de ida y vuelta ("O", "o").

FechaHora valores:

2009-06-15T13:45:30 (FechaHoraTipo)--> 2009-06-15T13:45:30.0000000-07:00

2009-06-15T13:45:30 (FechaHoraTipo)--> 2009-06-15T13:45:30.0000000Z

2009-06-15T13:45:30 (FechaHoraTipo)--> 2009-06-15T13:45:30.0000000

Desplazamiento de fecha y hora valores:

2009-06-15T13:45:30-07:00 --> 2009-06-15T13:45:30.0000000-07:00

"R", "r"

Estándar RFC1123

Más información: Especificador de formato RFC1123 ("R", "r").

2009-06-15T13:45:30 -> Lunes 15 de junio de 2009 20:45:30 GMT

"s"

Patrón de fecha/hora ordenable.

Más información: Especificador de formato ordenable ("s").

2009-06-15T13:45:30 (FechaHoraTipo) -> 2009-06-15T13:45:30

2009-06-15T13:45:30 (FechaHoraTipo) -> 2009-06-15T13:45:30

"t"

Estándar de tiempo abreviado.

Más información: Especificador de formato de hora abreviado ("t").

2009-06-15T13:45:30 -> 1:45 p.m. (en-US)

2009-06-15T13:45:30 -> 13:45 (hr-HR)

2009-06-01:45 -> 15T13:45:30 م (aire-EG)

"t"

Patrón de tiempo completo.

Más información: Especificador de formato de tiempo completo ("T").

2009-06-15T13:45:30 -> 1:45:30 p.m. (en-US)

2009-06-15T13:45:30 -> 13:45:30 (hr-HR)

2009-06-01:45:30 -> 15T13:45:30 min (ar-EG)

"tú"

Patrón universal de fecha/hora ordenable.

Más información: Especificador de formato de patrón ordenable universal ("u").

con un FechaHora valor: 2009-06-2009-06-15-> 15T13:45:30 13:45:30Z

con un Desplazamiento de fecha y hora valor: 2009-06-2009-06-15-> 15T13:45:30 20:45:30Z

"U"

Estándar universal de fecha/hora completa.

Más información: Especificador de formato estándar universal completo ("U").

2009-06-15T13:45:30 -> lunes 15 de junio de 2009 8:45:30 p.m. (en-US)

2009-06-15T13:45:30 -> 15 de junio de 2009 20:45:30 (sv-SE)

2009-06-15T13:45:30 -> Δευτέρα, 15 de noviembre de 2009 8:45:30 μμ (el-GR)

"Y", "y"

Patrón año mes.

Más información: Especificador de formato año mes ("Y").

2009-06-15T13:45:30 -> junio de 2009 (en-US)

2009-06-15T13:45:30 -> junio de 2009 (da-DK)

2009-06-15T13:45:30 -> junio de 2009 (id-ID)

Cualquier otro carácter individual

Especificador desconocido.

Genera un Excepción de formato del tiempo de ejecución.

Formato personalizado
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')

Resultado:

Tabla completa:

Formato

Descripción

Ejemplos

"d"

El día del mes, del 1 al 31.

Obtenga más información: el especificador de formato personalizado "d".

2009-06-01T13:45:30 -> 1

2009-06-15T13:45:30 -> 15

"dd"

El día del mes, del 01 al 31.

Obtenga más información: el especificador de formato personalizado "dd".

2009-06-01 -> 01T13:45:30

2009-06-15T13:45:30 -> 15

"dddd"

El nombre abreviado del día de la semana.

Obtenga más información: el especificador de formato personalizado "ddd".

2009-06-15T13:45:30 -> Lun (en-US)

2009-06-15T13:45:30 -> Пн (ru-RU)

2009-06-15T13:45:30 --> lun. (fr-FR)

"dddd"

El nombre completo del día de la semana.

Obtenga más información: el especificador de formato personalizado "dddd".

2009-06-15T13:45:30 -> Lunes (en-US)

2009-06-15T13:45:30 -> понедельник (ru-RU)

2009-06-15T13:45:30 -> lunes (fr-FR)

"F"

Las décimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "f".

2009-06-15T13:45:30.6170000 -> 6

2009-06-15T13:45:30.05 -> 0

"ff"

Las centésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "ff".

2009-06-15T13:45:30.6170000 -> 61

2009-06-00 -> 15T13:45:30.0050000

"fff"

Los milisegundos en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "fff".

15/06/2009 13:45:30.617 -> 617

15/06/2009 13:45:30.0005 -> 000

"fff"

Las diezmilésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "ffff".

2009-06-15T13:45:30.6175000 -> 6175

2009-06-0000 -> 15T13:45:30.0000500

"ffff"

Las centésimas de milésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "fffff".

2009-06-15T13:45:30.6175400 --> 61754

15/06/2009 13:45:30.000005 -> 00000

"ffffff"

Las millonésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "ffffff".

2009-06-15T13:45:30.6175420 --> 617542

2009-06-15T13:45:30.0000005 -> 000000

"ffffff"

Las diez millonésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "fffffff".

2009-06-15T13:45:30.6175425 -> 6175425

2009-06-15T13:45:30.0001150 -> 0001150

"F"

Si es distinto de cero, las décimas de segundo en un valor de fecha y hora.

Obtenga más información: especificador de formato personalizado "F".

2009-06-15T13:45:30.6170000 -> 6

2009-06-15T13:45:30.0500000 -> (sin salida)

"FF"

Si es distinto de cero, las centésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "FF".

2009-06-15T13:45:30.6170000 -> 61

2009-06-15T13:45:30.0050000 -> (sin salida)

"FFF"

Si es distinto de cero, los milisegundos en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "FFF".

2009-06-15T13:45:30.6170000 -> 617

2009-06-15T13:45:30.0005000 -> (sin salida)

"FFFF"

Si es distinto de cero, las décimas de milésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "FFFF".

2009-06-15T13:45:30.5275000 -> 5275

2009-06-15T13:45:30.0000500 -> (sin salida)

"FFFFFF"

Si es distinto de cero, las centésimas de milésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "FFFFF".

2009-06-15T13:45:30.6175400 --> 61754

2009-06-15T13:45:30.0000050 -> (sin salida)

"FFFFFF"

Si es distinto de cero, las millonésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "FFFFFF".

2009-06-15T13:45:30.6175420 --> 617542

2009-06-15T13:45:30.0000005 -> (sin salida)

"FFFFFFFF"

Si es distinto de cero, las diezmillonésimas de segundo en un valor de fecha y hora.

Obtenga más información: el especificador de formato personalizado "FFFFFFF".

2009-06-15T13:45:30.6175425 -> 6175425

2009-06-15T13:45:30.0001150 -> 000115

"g", "gg"

El período o época.

Obtenga más información: Especificador de formato personalizado "g" o "gg".

2009-06-15T13:45:30.6170000 -> A.D.

"h"

La hora, utilizando un reloj de 12 horas del 1 al 12.

Obtenga más información: el especificador de formato personalizado "h".

2009-06-15T01:45:30 -> 1

2009-06-15T13:45:30 -> 1

"S.S"

La hora, utilizando un reloj de 12 horas de 01 a 12.

Obtenga más información: el especificador de formato personalizado "hh".

2009-06-01 -> 15T01:45:30

2009-06-01 -> 15T13:45:30

"H"

La hora, utilizando un reloj de 24 horas de 0 a 23.

Obtenga más información: especificador de formato personalizado "H".

2009-06-15T01:45:30 -> 1

2009-06-13 -> 15T13:45:30

"S.S"

La hora, utilizando un reloj de 24 horas de 00 a 23.

Obtenga más información: el especificador de formato personalizado "HH".

2009-06-01 -> 15T01:45:30

2009-06-13 -> 15T13:45:30

"k"

Información de zona horaria.

Obtenga más información: el especificador de formato personalizado "K".

Con FechaHora valores:

2009-06-15T13:45:30, qué tipo no se especifica ->

2009-06-15T13:45:30, escriba Utc -> Z

2009-06-15T13:45:30, escriba Local->-07:00 (depende de la configuración de la computadora local)

Con Desplazamiento de fecha y hora valores:

2009-06-15T01:45:30-07:00--> -07:00

2009-06-15T08:45:30 + 00:00 --> + 00:00

"metro"

El minuto, del 0 al 59.

Obtenga más información: el especificador de formato personalizado "m".

2009-06-15T01:09:30 -> 9

2009-06-29 -> 15T13:29:30

"mm"

El minuto, de 00 a 59.

Obtenga más información: el especificador de formato personalizado "mm".

2009-06-15T01:09:30 -> 09

2009-06-45 -> 15T01:45:30

"METRO"

El mes, del 1 al 12.

Obtenga más información: el especificador de formato personalizado "M".

2009-06-15T13:45:30 -> 6

"mm"

El mes, del 01 al 12.

Obtenga más información: el especificador de formato personalizado "MM".

2009-06-06 -> 15T13:45:30

"MMM"

El nombre abreviado del mes.

Obtenga más información: el especificador de formato personalizado "MMM".

2009-06-15T13:45:30 -> Jun (en-US)

2009-06-15T13:45:30 -> junio (fr-FR)

2009-06-15T13:45:30 -> junio (zu-ZA)

"MMMM"

El nombre completo del mes.

Obtenga más información: el especificador de formato personalizado "MMMM".

2009-06-15T13:45:30 -> junio (es)

2009-06-15T13:45:30 -> junio (da-DK)

2009-06-15T13:45:30 -> uJuni (zu-ZA)

"s"

El segundo, del 0 al 59.

Obtenga más información: el especificador de formato personalizado "s".

2009-06-15T13:45:09 -> 9

"ss"

El segundo, del 00 al 59.

Obtenga más información: el especificador de formato personalizado "ss".

2009-06-15T13:45:09 -> 09

"t"

El primer carácter del designador AM/PM.

Obtenga más información: el especificador de formato personalizado "t".

2009-06-15T13:45:30 -> P (es)

2009-06-15T13:45:30 -> 午 (ja-JP)

2009-06-15T13:45:30 -> (fr-FR)

"tt"

El designador AM/PM.

Obtenga más información: el especificador de formato personalizado "tt".

2009-06-15T13:45:30 -> PM (en-US)

2009-06-15T13:45:30 -> 午後 (ja-JP)

2009-06-15T13:45:30 -> (fr-FR)

"y"

El año, de 0 a 99.

Obtenga más información: el especificador de formato personalizado "y".

0001-01-01T00:00:00 -> 1

0900-01-01T00:00:00 -> 0

1900-01-01T00:00:00 -> 0

2009-06-15T13:45:30 -> 9

2019-06-19 -> 15T13:45:30

"AUTOMÓVIL CLUB BRITÁNICO"

El año, de 00 a 99.

Obtenga más información: el especificador de formato personalizado "yy".

0001-01-01 -> 01T00:00:00

0900-01-00 -> 01T00:00:00

1900-01-00 -> 01T00:00:00

2019-06-19 -> 15T13:45:30

"aaa"

El año, con un mínimo de tres dígitos.

Obtenga más información: el especificador de formato personalizado "yyy".

0001-01-01T00:00:00 -> 001

0900-01-01T00:00:00 -> 900

1900-01-1900 -> 01T00:00:00

2009-06-2009 -> 15T13:45:30

"aaaa"

El año como un número de cuatro dígitos.

Obtenga más información: el especificador de formato personalizado "yyyy".

0001-01-01T00:00:00 -> 0001

0900-01-01T00:00:00 -> 0900

1900-01-1900 -> 01T00:00:00

2009-06-2009 -> 15T13:45:30

"aaaaa"

El año como un número de cinco dígitos.

Obtenga más información: el especificador de formato personalizado "yyyyy".

0001-01-01T00:00:00 -> 00001

2009-06-15T13:45:30 -> 02009

"z"

Diferencia horaria UTC, sin ceros a la izquierda.

Obtenga más información: el especificador de formato personalizado "z".

2009-06-15T13:45:30-07:00 -> -7

"zz"

Diferencia horaria UTC, con un cero inicial de un valor de un solo dígito.

Obtenga más información: el especificador de formato personalizado "zz".

2009-06-15T13:45:30-07:00->-07

"zzz"

Horas y minutos compensados ​​con respecto a UTC.

Obtenga más información: el especificador de formato personalizado "zzz".

2009-06-15T13:45:30-07:00->-07:00

":"

El separador de tiempo.

Obtenga más información: el especificador de formato personalizado ":".

2009-06--> 15T13:45:30: (en-US)

2009-06--> 15T13:45:30. (es-ES)

2009-06--> 15T13:45:30: (ja-JP)

"/"

El separador de fechas.

Más información: el especificador de formato personalizado "/".

2009-06-15T13:45:30 -> / (es)

2009-06--> 15T13:45:30 - (aire-DZ)

2009-06--> 15T13:45:30. (tr-TR)

"secuencia"

'secuencia'

Delimitador de cadena literal.

Obtenga más información: Literales de caracteres.

2009-06-15T13:45:30 ("arr:" h:m t) -> llegar: 1:45 P

2009-06-15T13:45:30 ('arr:' h:m t) -> llegar: 1:45 P

%

Establece el siguiente carácter como especificador de formato personalizado.

Obtenga más información:usando especificadores de formato personalizados simples.

2009-06-15T13:45:30 (%h) -> 1

\

El personaje de fuga.

Obtenga más información: Literales de caracteres y usando el carácter de escape.

2009-06-15T13:45:30 (h\h) -> 1h

cualquier otro personaje

El carácter se copia en la cadena de resultado sin cambios.

Obtenga más información: Literales de caracteres.

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.

Si no conoces SQLCLR, o no sabes cómo crear tu primer proyecto, lee el post Introducción a SQL CLR (Common Language Runtime) en SQL Server.

Cómo formatear fechas con el CLR

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.

Un fuerte abrazo y hasta luego.

Referencias:
FORMATO (Transact-SQL)
Tipos de formato en .NET Framework
Cadenas de formato numérico estándar
Cadenas de formato numérico personalizado
Cadenas de formato de fecha y hora estándar
Cadenas de formato de fecha y hora personalizadas