
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-31MM
: mes del 01-12yy
: 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-12mm
: minutos de la hora del 00-59ss
: 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».
Consulta | Salida Ejemplo |
---|---|
SELECT FORMAT(getdate(), 'dd/MM/yyyy') AS date | 21/03/2021 |
SELECT FORMAT(getdate(), 'dd/MM/yyyy, hh:mm:ss') AS date | 21/03/2021, 11:36:14 |
SELECT FORMAT(getdate(), 'dddd, MMMM, yyyy') AS date | miércoles, marzo, 2021 |
SELECT FORMAT(getdate(), 'MMM dd yyyy') AS date | mar 21 2021 |
SELECT FORMAT(getdate(), 'MM.dd.yy') AS date | 03.21.21 |
SELECT FORMAT(getdate(), 'MM-dd-yy') AS date | 03-21-21 |
SELECT FORMAT(getdate(), 'hh:mm:ss tt') AS date | 11:36:14 AM |
SELECT FORMAT(getdate(), 'd','us') AS date | 03/21/2021 |
SELECT FORMAT(getdate(), 'yyyy-MM-dd hh:mm:ss tt') AS date | 2021-03-21 11:36:14 AM |
SELECT FORMAT(getdate(), 'yyyy.MM.dd hh:mm:ss t') AS date | 2021.03.21 11:36:14 A |
SELECT FORMAT(getdate(), 'dddd, MMMM, yyyy','es-es') AS date | domingo, marzo, 2021 |
SELECT FORMAT(getdate(), 'dddd dd, MMMM, yyyy','ja-jp') AS date | 日曜日 21, 3月, 2021 |
SELECT FORMAT(getdate(), 'MM-dd-yyyy') AS date | 03-21-2021 |
SELECT FORMAT(getdate(), 'MM dd yyyy') AS date | 03 21 2021 |
SELECT FORMAT(getdate(), 'yyyyMMdd') AS date | 20231011 |
SELECT FORMAT(getdate(), 'HH:mm:dd') AS time | 11:36:14 |
SELECT FORMAT(getdate(), 'HH:mm:dd.ffffff') AS time | 11: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-31dddd
: día escrito en letrasMM
: número de mes del 01-12MMM
: nombre del mes abreviadoMMMM
: nombre del mes completoyy
: año con dos dígitosyyyy
: año con cuatro dígitoshh
: hora del 01-12HH
: hora del 00-23mm
: minutos del 00-59ss
: segundos del 00-59tt
: muestra AM o PMd
: 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:
Cultura | Consulta | Salida Ejemplo |
---|---|---|
Inglés-EE.UU. | SELECT FORMAT(getdate(), 'd', 'en-US') AS date | 10/11/2021 |
Francés-Francia | SELECT FORMAT(getdate(), 'd', 'fr-FR') AS date | 11/10/2021 |
Armenio-Armenia | SELECT FORMAT(getdate(), 'd', 'hy-AM') AS date | 11.10.2021 |
Bosnio-Latino | SELECT FORMAT(getdate(), 'd', 'bs-Latn-BA') AS date | 11. 10. 2021. |
Chino Simplificado | SELECT FORMAT(getdate(), 'd', 'zh-CN') AS date | 2021/10/11 |
Danés-Dinamarca | SELECT FORMAT(getdate(), 'MM.dd.yy') AS date | 11-10-2021 |
Dari-Afganistán | SELECT FORMAT(getdate(), 'd', 'prs-AF') AS date | 1400/7/19 |
Divehi-Maldivas | SELECT FORMAT(getdate(), 'd', 'dv-MV') AS date | 11/10/21 |
Francés-Bélgica | SELECT FORMAT(getdate(), 'd', 'fr-BE') AS date | 11-10-21 |
Francés-Canadá | SELECT FORMAT(getdate(), 'd', 'fr-CA') AS date | 2021-10-11 |
Húngaro-Hungría | SELECT FORMAT(getdate(), 'd', 'hu-HU') AS date | 2021. 10. 11. |
IsiXhosa-África del Sur | SELECT FORMAT(getdate(), 'd', 'xh-ZA') AS date | 2021-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:
Formato | Consulta | Salida Ejemplo |
---|---|---|
Moneda-Inglés-EE.UU. | SELECT FORMAT(200.36, 'C', 'en-us') AS 'Currency Format' | $200.36 |
Moneda-Alemania | SELECT FORMAT(200.36, 'C', 'de-DE') AS 'Currency Format' | 200,36 € |
Moneda-Japón | SELECT FORMAT(200.36, 'C', 'ja-JP') AS 'Currency Format' | ¥200 |
Formato General | SELECT FORMAT(200.3625, 'G', 'en-us') AS 'Format' | 200.3625 |
Formato Numérico | SELECT FORMAT(200.3625, 'N', 'en-us') AS 'Format' | 200.36 |
Numérico 3 decimales | SELECT FORMAT(11.0, 'N3', 'en-us') AS 'Format' | 11.000 |
Decimal | SELECT FORMAT(12, 'D', 'en-us') AS 'Format' | 12 |
Decimal 4 | SELECT FORMAT(12, 'D4', 'en-us') AS 'Format' | 0012 |
Exponencial | SELECT FORMAT(120, 'E', 'en-us') AS 'Format' | 1.200000E+002 |
Porcentaje | SELECT FORMAT(0.25, 'P', 'en-us') AS 'Format' | 25.00% |
Hexadecimal | SELECT FORMAT(11, 'X', 'en-us') AS 'Format' | B |
Ventajas y Desventajas de Usar FORMAT
Ventajas
- Legibilidad: La función
FORMAT
es más legible y comprensible queCONVERT
yCAST
. - Flexibilidad: Permite especificar formatos personalizados y utiliza cadenas de formato .NET, lo que da una gran flexibilidad.
- Soporte para Culturas: Facilita la localización al permitir el uso de parámetros de cultura, lo que es útil para aplicaciones internacionales.
Desventajas
- Rendimiento: La función
FORMAT
puede ser significativamente más lenta queCONVERT
yCAST
, especialmente cuando se usa en consultas grandes o en bucles. - 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
- 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.
- Considerar la Zona Horaria: Asegúrate de manejar correctamente las zonas horarias, especialmente en aplicaciones distribuidas globalmente.
- 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