Guía Completa para Formatear Fechas en SQL FORMAT Server 2022

Guía Completa para Formatear Fechas en SQL FORMAT Server 2022

En versiones de Microsoft SQL Server 2008 y anteriores, se utilizaba la función CONVERT para manejar el formato de fechas en consultas SQL, declaraciones SELECT, procedimientos almacenados y scripts T-SQL. Sin embargo, la función CONVERT no es muy flexible y ofrece formatos de fecha limitados. A partir de SQL Server 2012, se introdujo la función FORMAT, que es mucho más fácil de usar para formatear fechas. Esta guía muestra diferentes ejemplos de cómo usar esta nueva función para formatear fechas.

Solución

Con el lanzamiento de SQL Server 2012, se introdujo la función FORMAT, similar a la función to_date de Oracle. Muchos administradores de bases de datos de Oracle se quejaron de la poca flexibilidad de la función CONVERT de SQL Server, y ahora tenemos una nueva forma de formatear fechas en SQL Server.

Con la función FORMAT de SQL Server, no es necesario conocer el número de formato para obtener el formato de fecha deseado. Simplemente especificamos el formato de visualización que queremos y obtenemos ese formato.

Formateo de Fechas con la Función FORMAT

Usa la función FORMAT para formatear los tipos de datos de fecha y hora desde una columna de fecha (date, datetime, datetime2, smalldatetime, datetimeoffset, etc.) en una tabla o una variable como GETDATE().

  • Para obtener DD/MM/YYYY: SELECT FORMAT(getdate(), 'dd/MM/yyyy') AS date
  • Para obtener MM-DD-YY: SELECT FORMAT(getdate(), 'MM-dd-yy') AS date

Consulta más ejemplos a continuación.

Sintaxis de la Función FORMAT en SQL Server

FORMAT (valor, formato [, cultura])

Ejemplos de Formato de Fechas con FORMAT

Comencemos con un ejemplo:

SELECT FORMAT(getdate(), 'dd-MM-yy') AS date

El formato será el siguiente:

  • dd: día del mes del 01-31
  • MM: mes del 01-12
  • yy: año de dos dígitos

Si se ejecuta el 21 de marzo de 2021, la salida sería: 21-03-21.

Probemos otro:

SELECT FORMAT(getdate(), 'hh:mm:ss') AS time

El formato será el siguiente:

  • hh: hora del día del 01-12
  • mm: minutos de la hora del 00-59
  • ss: segundos del minuto del 00-59

La salida será: 02:48:42.

Ejemplos de Salida de Fecha con FORMAT en SQL Server

A continuación se muestra una lista de formatos de fecha y hora con un ejemplo de salida. La fecha actual utilizada para todos estos ejemplos es «2021-03-21 11:36:14.840».

ConsultaSalida Ejemplo
SELECT FORMAT(getdate(), 'dd/MM/yyyy') AS date21/03/2021
SELECT FORMAT(getdate(), 'dd/MM/yyyy, hh:mm:ss') AS date21/03/2021, 11:36:14
SELECT FORMAT(getdate(), 'dddd, MMMM, yyyy') AS datemiércoles, marzo, 2021
SELECT FORMAT(getdate(), 'MMM dd yyyy') AS datemar 21 2021
SELECT FORMAT(getdate(), 'MM.dd.yy') AS date03.21.21
SELECT FORMAT(getdate(), 'MM-dd-yy') AS date03-21-21
SELECT FORMAT(getdate(), 'hh:mm:ss tt') AS date11:36:14 AM
SELECT FORMAT(getdate(), 'd','us') AS date03/21/2021
SELECT FORMAT(getdate(), 'yyyy-MM-dd hh:mm:ss tt') AS date2021-03-21 11:36:14 AM
SELECT FORMAT(getdate(), 'yyyy.MM.dd hh:mm:ss t') AS date2021.03.21 11:36:14 A
SELECT FORMAT(getdate(), 'dddd, MMMM, yyyy','es-es') AS datedomingo, marzo, 2021
SELECT FORMAT(getdate(), 'dddd dd, MMMM, yyyy','ja-jp') AS date日曜日 21, 3月, 2021
SELECT FORMAT(getdate(), 'MM-dd-yyyy') AS date03-21-2021
SELECT FORMAT(getdate(), 'MM dd yyyy') AS date03 21 2021
SELECT FORMAT(getdate(), 'yyyyMMdd') AS date20231011
SELECT FORMAT(getdate(), 'HH:mm:dd') AS time11:36:14
SELECT FORMAT(getdate(), 'HH:mm:dd.ffffff') AS time11:36:14.84000

Como puedes ver, utilizamos muchas opciones para el formateo de fecha y hora, que se enumeran a continuación:

  • dd: día del mes del 01-31
  • dddd: día escrito en letras
  • MM: número de mes del 01-12
  • MMM: nombre del mes abreviado
  • MMMM: nombre del mes completo
  • yy: año con dos dígitos
  • yyyy: año con cuatro dígitos
  • hh: hora del 01-12
  • HH: hora del 00-23
  • mm: minutos del 00-59
  • ss: segundos del 00-59
  • tt: muestra AM o PM
  • d: día del mes del 1-31 (si se usa solo, muestra la fecha completa)
  • us: muestra la fecha usando la cultura de EE. UU. que es MM/DD/YYYY

Ejemplos de Diferentes Formatos de Fecha Usando FORMAT

Formato de Fecha dd/MM/yyyy con FORMAT en SQL

El siguiente ejemplo muestra cómo obtener un formato de fecha dd/MM/yyyy, como 30/04/2008 para el 4 de abril de 2008:

SELECT 
CurrencyCode,
Name,
FORMAT(ModifiedDate, 'dd/MM/yyyy') AS FormattedDate
FROM
Sales.Currency;

Formato de Fecha MM/dd/yyyy con FORMAT en SQL

El siguiente ejemplo muestra cómo obtener un formato de fecha MM/dd/yyyy, como 04/30/2008 para el 4 de abril de 2008:

SELECT 
CurrencyCode,
Name,
FORMAT(ModifiedDate, 'MM/dd/yyyy') AS FormattedDate
FROM
Sales.Currency;

Formato de Fecha yyyy MM dd con FORMAT en SQL

Si queremos cambiar al formato yyyy MM dd usando la función FORMAT, el siguiente ejemplo puede ayudarte:

SELECT 
CurrencyCode,
Name,
FORMAT(ModifiedDate, 'yyyy MM dd') AS FormattedDate
FROM
Sales.Currency;

Formato de Fecha yyyyMMdd con FORMAT en SQL

El formato yyyyMMdd también es un formato comúnmente utilizado para almacenar datos en la base de datos, para comparaciones en desarrollo de software, sistemas financieros, etc. El siguiente ejemplo muestra cómo usar este formato:

SELECT 
CurrencyCode,
Name,
FORMAT(ModifiedDate, 'yyyyMMdd') AS FormattedDate
FROM
Sales.Currency;

Formato de Fecha ddMMyyyy con FORMAT en SQL

El formato ddMMyyyy es común en países como Inglaterra, Irlanda, Australia, Nueva Zelanda, Nepal, Malasia, Hong Kong, Qatar, Arabia Saudita y varios otros países. El siguiente ejemplo muestra cómo usarlo:

SELECT 
CurrencyCode,
Name,
FORMAT(ModifiedDate, 'ddMMyyyy') AS FormattedDate
FROM
Sales.Currency;

Formato de Fecha yyyy-MM-dd con FORMAT en SQL

El formato yyyy-MM-dd es comúnmente utilizado en EE. UU., Canadá, México, América Central y otros países. El siguiente ejemplo muestra cómo usar este formato:

SELECT 
CurrencyCode,
Name,
FORMAT(ModifiedDate, 'yyyy-MM-dd') AS FormattedDate
FROM
Sales.Currency;

El siguiente ejemplo creará una vista con el formato yyyy-MM-dd:

CREATE VIEW dbo.CurrencyView AS
SELECT
CurrencyCode,
Name,
FORMAT(ModifiedDate, 'yyyy-MM-dd') AS FormattedDate
FROM
Sales.Currency;

SELECT * FROM dbo.CurrencyView;

Formateo de Fechas con Cultura en SQL Server

Otra opción para la función FORMAT es cultura. Con la opción de cultura, puedes obtener un formato regional. Por ejemplo, en EE. UU., el formato sería:

SELECT FORMAT(getdate(), 'd', 'en-us') AS date;

En EE. UU. el formato es mes, día, año. Si se ejecuta el 21 de marzo de 2021, la salida sería: 3/21/2021.

Otro ejemplo donde usaremos la cultura española en Bolivia (es-bo):

sqlCopiar códigoSELECT FORMAT(getdate(), 'd', 'es-bo') AS date;

En Bolivia el formato es día, mes, año. Si se ejecuta el 21 de marzo de 2021, la salida sería: 21/03/2021.

Ejemplos de Salida de Fecha con Diferentes Culturas

A continuación se muestra una tabla con diferentes ejemplos para diferentes culturas para el 11 de octubre de 2021:

CulturaConsultaSalida Ejemplo
Inglés-EE.UU.SELECT FORMAT(getdate(), 'd', 'en-US') AS date10/11/2021
Francés-FranciaSELECT FORMAT(getdate(), 'd', 'fr-FR') AS date11/10/2021
Armenio-ArmeniaSELECT FORMAT(getdate(), 'd', 'hy-AM') AS date11.10.2021
Bosnio-LatinoSELECT FORMAT(getdate(), 'd', 'bs-Latn-BA') AS date11. 10. 2021.
Chino SimplificadoSELECT FORMAT(getdate(), 'd', 'zh-CN') AS date2021/10/11
Danés-DinamarcaSELECT FORMAT(getdate(), 'MM.dd.yy') AS date11-10-2021
Dari-AfganistánSELECT FORMAT(getdate(), 'd', 'prs-AF') AS date1400/7/19
Divehi-MaldivasSELECT FORMAT(getdate(), 'd', 'dv-MV') AS date11/10/21
Francés-BélgicaSELECT FORMAT(getdate(), 'd', 'fr-BE') AS date11-10-21
Francés-CanadáSELECT FORMAT(getdate(), 'd', 'fr-CA') AS date2021-10-11
Húngaro-HungríaSELECT FORMAT(getdate(), 'd', 'hu-HU') AS date2021. 10. 11.
IsiXhosa-África del SurSELECT FORMAT(getdate(), 'd', 'xh-ZA') AS date2021-10-11

Ejemplos de Formato de Números en SQL Server

La función FORMAT también permite formatear números según la cultura. La siguiente tabla muestra diferentes ejemplos:

FormatoConsultaSalida Ejemplo
Moneda-Inglés-EE.UU.SELECT FORMAT(200.36, 'C', 'en-us') AS 'Currency Format'$200.36
Moneda-AlemaniaSELECT FORMAT(200.36, 'C', 'de-DE') AS 'Currency Format'200,36 €
Moneda-JapónSELECT FORMAT(200.36, 'C', 'ja-JP') AS 'Currency Format'¥200
Formato GeneralSELECT FORMAT(200.3625, 'G', 'en-us') AS 'Format'200.3625
Formato NuméricoSELECT FORMAT(200.3625, 'N', 'en-us') AS 'Format'200.36
Numérico 3 decimalesSELECT FORMAT(11.0, 'N3', 'en-us') AS 'Format'11.000
DecimalSELECT FORMAT(12, 'D', 'en-us') AS 'Format'12
Decimal 4SELECT FORMAT(12, 'D4', 'en-us') AS 'Format'0012
ExponencialSELECT FORMAT(120, 'E', 'en-us') AS 'Format'1.200000E+002
PorcentajeSELECT FORMAT(0.25, 'P', 'en-us') AS 'Format'25.00%
HexadecimalSELECT FORMAT(11, 'X', 'en-us') AS 'Format'B

Ventajas y Desventajas de Usar FORMAT

Ventajas

  1. Legibilidad: La función FORMAT es más legible y comprensible que CONVERT y CAST.
  2. Flexibilidad: Permite especificar formatos personalizados y utiliza cadenas de formato .NET, lo que da una gran flexibilidad.
  3. Soporte para Culturas: Facilita la localización al permitir el uso de parámetros de cultura, lo que es útil para aplicaciones internacionales.

Desventajas

  1. Rendimiento: La función FORMAT puede ser significativamente más lenta que CONVERT y CAST, especialmente cuando se usa en consultas grandes o en bucles.
  2. Dependencia del CLR: FORMAT depende del Common Language Runtime (CLR) de .NET, lo que puede introducir una sobrecarga adicional.

Comparación de FORMAT SQL con CONVERT SQL y CAST SQL

Ejemplos Usando CONVERT y CAST

Usando CONVERT

SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS Date;  -- dd/mm/yyyy
SELECT CONVERT(VARCHAR(10), GETDATE(), 110) AS Date; -- mm-dd-yyyy

Usando CAST

SELECT CAST(GETDATE() AS VARCHAR(10));  -- Default format based on settings

Ejemplos Equivalentes Usando FORMAT

SELECT FORMAT(GETDATE(), 'dd/MM/yyyy') AS Date;
SELECT FORMAT(GETDATE(), 'MM-dd-yyyy') AS Date;

Consideraciones de Rendimiento

La función FORMAT puede ser conveniente, pero en escenarios de alto rendimiento, CONVERT y CAST pueden ser preferibles debido a su menor sobrecarga.

Prueba de Rendimiento FORMAT SQL y CONVERT SQL

Una forma de evaluar el impacto de rendimiento es comparar el tiempo de ejecución de consultas usando FORMAT y CONVERT.

Usando FORMAT
SET STATISTICS TIME ON;
SELECT FORMAT(ModifiedDate, 'dd/MM/yyyy') AS FormattedDate FROM Sales.Currency;
SET STATISTICS TIME OFF;

-- Usando CONVERT
SET STATISTICS TIME ON;
SELECT CONVERT(VARCHAR(10), ModifiedDate, 103) AS FormattedDate FROM Sales.Currency;
SET STATISTICS TIME OFF;

Formateo de Fechas en Funciones Escalares Definidas por el Usuario

Puedes encapsular la lógica de formateo de fechas en una función escalar definida por el usuario para reutilizarla en múltiples consultas.

CREATE FUNCTION dbo.FormatDate (@date DATETIME, @format NVARCHAR(20))
RETURNS NVARCHAR(20)
AS
BEGIN
RETURN FORMAT(@date, @format);
END
GO

-- Usando la función
SELECT dbo.FormatDate(GETDATE(), 'dd/MM/yyyy') AS FormattedDate;

Consideraciones sobre Zonas Horarias y Tiempos UTC SQL

Conversión entre Zonas Horarias

SQL Server permite convertir entre diferentes zonas horarias utilizando la función AT TIME ZONE.

SELECT 
CONVERT(datetime, GETDATE()) AT TIME ZONE 'UTC' AS UTC_Time,
CONVERT(datetime, GETDATE()) AT TIME ZONE 'Pacific Standard Time' AS PST_Time;

Almacenamiento y Manipulación de Tiempos UTC SQL

Es una buena práctica almacenar tiempos en UTC y convertirlos a la zona horaria local de la aplicación cuando sea necesario.

-- Almacenando el tiempo actual en UTC
DECLARE @currentTimeUTC DATETIME = GETUTCDATE();

-- Convirtiendo a la zona horaria local
SELECT @currentTimeUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS LocalTime;

Ejemplos de Casos de Uso en Aplicaciones Reales

Formateo de Fechas en Reportes

En reportes generados desde SQL Server, es común requerir fechas en formatos específicos.

SELECT 
ReportDate = FORMAT(OrderDate, 'MMMM dd, yyyy'),
TotalSales
FROM
Sales.Orders
WHERE
OrderDate BETWEEN '2021-01-01' AND '2021-12-31';

Formateo de Fechas en Aplicaciones Multilingües

Para aplicaciones que soportan múltiples idiomas, utilizar FORMAT con parámetros de cultura puede facilitar la localización.

SELECT 
FORMAT(GETDATE(), 'D', 'fr-FR') AS FrenchDate,
FORMAT(GETDATE(), 'D', 'de-DE') AS GermanDate,
FORMAT(GETDATE(), 'D', 'en-US') AS USDate;

Buenas Prácticas para el Formateo de Fechas

  1. Usar Formatos Estándar Cuando Sea Posible: Prefiere los formatos estándar de fecha y hora siempre que sea posible para garantizar consistencia y compatibilidad.
  2. Considerar la Zona Horaria: Asegúrate de manejar correctamente las zonas horarias, especialmente en aplicaciones distribuidas globalmente.
  3. Optimización de Consultas: Usa FORMAT con precaución en consultas de gran volumen debido a su impacto en el rendimiento.

Conclusión

En este artículo, vimos diferentes ejemplos para cambiar la salida de diferentes formatos en una base de datos de MS SQL. La función FORMAT utiliza el Common Language Runtime (CLR) y se han observado diferencias notables de rendimiento entre otros enfoques (función CONVERT, función CAST, etc.), mostrando que FORMAT es mucho más lento. Sin embargo, ofrece una flexibilidad y simplicidad que pueden ser muy útiles en muchos escenarios.

El uso de la función FORMAT en SQL Server 2022 proporciona una manera más intuitiva y flexible de formatear fechas y horas en comparación con métodos más antiguos como CONVERT y CAST. Sin embargo, es importante ser consciente de las implicaciones de rendimiento y usar esta función adecuadamente según el contexto y los requisitos de la aplicación. Al combinar estas herramientas con buenas prácticas y consideraciones de rendimiento, puedes obtener el máximo beneficio del formateo de fechas en SQL Server.

Enlaces de interés

Monitoreo y Mantenimiento SQL: Mantén Tu Base de Datos Saludable

UPDATE JOIN en SQL para Actualizar Tablas Relacionadas

UPDATE JOIN en SQL para Actualizar Tablas Relacionadas

Generando Script de creación de Usuarios en SQL Server

Convertir una Fecha y Hora a Solo Fecha en SQL

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.

error: Contenido protegido :)