Aunque ya ha pasado un tiempo desde la llegada de SQL Server 2022 no es raro encontrarse con gente que está empezando a adoptarlo o, con gente que aun llevando tiempo trabajando en esta versión no conoce todas sus novedades. Entre estas nuevas funcionalidades, una de las más destacadas es la función DATETRUNC. Esta nueva función integrada de fecha y hora simplifica enormemente el trabajo con fechas, permitiendo a los desarrolladores y administradores de bases de datos realizar tareas comunes de manera más eficiente y con menos código.
Hasta ahora, manipular fechas en SQL Server requería el uso de múltiples funciones y a menudo resultaba en código complicado y difícil de leer. Aunque si has visto nuestro video sobre el tema ya serás un experto. Con la llegada de DATETRUNC, estas tareas se simplifican significativamente. La función DATETRUNC nos permite truncar una fecha a una parte específica, como año, mes, día, hora, minuto, etc., eliminando la necesidad de combinaciones complejas de funciones de fecha.
¿Qué es DATETRUNC?
La función DATETRUNC recibe como parámetro una fecha que le pasemos y la trunca al nivel de precisión que hayamos especificado. Esto es especialmente útil cuando necesitamos agrupar datos por períodos específicos, como meses o trimestres, o simplemente cuando queremos estandarizar las fechas a un nivel común para comparaciones más precisas.
Sintaxis de DATETRUNC
La sintaxis de la función DATETRUNC es sencilla y directa, solo tendremos que pasar el nivel de precisión al que queremos truncar y un valor tipo fecha o fecha y hora:
DATETRUNC ( datepart, date )
- datepart: Especifica la parte de la fecha a la que queremos truncar. Puede ser año, trimestre, mes, día, hora, minuto, segundo, etc.
- date: La fecha que queremos truncar.
Ejemplos Prácticos de DATETRUNC
Por si han quedado dudas, y como a caminar se aprende caminando vamos con algunos ejemplos prácticos:
Truncar a Año
Imaginemos que tenemos una fecha y queremos truncarla al inicio del año:
SELECT DATETRUNC(year, '2023-07-15 14:30:00') AS TruncatedDate;
Este código devolverá: 2023-01-01 00:00:00.000. Hemos truncado la fecha al primer día del año 2023.

Truncar a Mes
Si queremos truncar una fecha al inicio del mes seguiremos la misma lógica:
SELECT DATETRUNC(month, '2023-07-15 14:30:00') AS TruncatedDate;
El resultado será: 2023-07-01 00:00:00.000. La fecha se trunca al primer día del mes de julio de 2023.

Truncar a Día
Para truncar una fecha al inicio del día:
SELECT DATETRUNC(day, '2023-07-15 14:30:00') AS TruncatedDate;
El resultado será: 2023-07-15 00:00:00.000. En este caso, la hora, los minutos y los segundos se eliminan, dejando solo la fecha.

Aplicaciones Prácticas en el Mundo Real
Todo esto es muy bonito pero, lo importante es cómo usarlo y cuando. Ahora te voy a contar algunos ejemplos útiles que se me ocurren para DATETRUNC. Seguro que a nuestros amigos de BI que siempre están jugando con dimensiones de fechas se le ocurren un montón más de ejemplos.
Agrupación de Datos
Una de las aplicaciones más comunes de DATETRUNC es en la agrupación de datos. Por ejemplo, podemos querer agrupar ventas por mes:
SELECT
DATETRUNC(month, OrderDate) AS SaleMonth,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY DATETRUNC(month, OrderDate);
Este ejemplo agrupa las ventas por mes, facilitando la generación de reportes mensuales.

Comparaciones de Fechas
Otra aplicación que nos va a ser muy útil es en las comparaciones de fechas. Si queremos comparar sólo la parte de la fecha sin considerar la hora, podemos utilizar DATETRUNC:
SELECT *
FROM Events
WHERE DATETRUNC(day, EventDate) = '2023-07-15';
Aquí, estamos comparando solo la parte de la fecha de EventDate con el 15 de julio de 2023, ignorando la hora.
Ventajas de Usar DATETRUNC
Como podrás imaginar, si le he dedicado un tiempo a este artículo es porque creo que DATETRUNC tiene alguna ventaja para ti. Como ya hemos comentado una de sus grandes bazas es la sencillez del código, que simplifica su escritura y comprensión, pero no es solo eso, también vamos a notar mejoras en el rendimiento.
Código Más Limpio y Legible
Antes de la introducción de DATETRUNC, truncar fechas requería el uso de funciones como DATEADD y DATEDIFF en combinaciones complejas. Con DATETRUNC, el código es mucho más limpio y fácil de entender.
-- Sin DATETRUNC
SELECT DATEADD(month, DATEDIFF(month, 0, '2023-07-15 14:30:00'), 0) AS TruncatedDate;
-- Con DATETRUNC
SELECT DATETRUNC(month, '2023-07-15 14:30:00') AS TruncatedDate;
¿Mejor Rendimiento?
La función DATETRUNC, en teoría, está optimizada para el rendimiento, reduciendo la sobrecarga de cómputo comparado con las versiones anteriores que implicaban múltiples ejecuciones de funciónes. Aunque como siempre, sigue siendo mejor no usar funciones.

En este ejemplo vemos como con la función DATETRUNC el coste de la consulta es un 1% menor pero no se acerca en absoluto a los resultados cuando no usamos funciones de fecha. Es curioso porque Microsoft asegura que ha optimizado el rendimiento pero el comportamiento sigue siendo el mismo.
El motor de SQL dice: “No tengo ni idea de cuál es la primera fecha que produciría YEAR(2017) y es imposible que pueda adivinarlo por mi mismo. Mejor leeré todas las fechas desde los inicios de los tiempos hasta ahora.” Esto es absurdo, lo sé, pero es así, y es una de las razones por las que siempre se dice que evitemos usar funciones en la cláusula WHERE. Como ves con DATETRUNC en SQL Server 2022 no es diferente.
Conclusión
SQL Server 2022 introdujo innovaciones y mejoras en nuestra capacidad para gestionar y manipular datos de manera eficiente. La función DATETRUNC es una adición bienvenida, simplificando la manipulación de fechas y mejorando la legibilidad y el rendimiento del código. Al empezar a usar esta nueva función, podremos escribir consultas más claras y un poco más eficientes, facilitando nuestro trabajo diario. Sin embargo no es oro todo lo que reluce y, como toda función, debemos evitar su uso en los filtros.
Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

