Saltar al contenido

¿Cómo puedo truncar una fecha y hora en SQL Server?

Al fin luego de mucho batallar hemos encontrado la solución de este inconveniente que agunos lectores de esta web han tenido. Si deseas compartir algún detalle no dejes de compartir tu conocimiento.

Solución:

Esto continúa reuniendo votos adicionales con frecuencia, incluso varios años después, por lo que necesito actualizarlo para las versiones modernas de Sql Server. Para Sql Server 2008 y versiones posteriores, es simple:

cast(getDate() As Date)

Tenga en cuenta que los últimos tres párrafos cerca de la parte inferior aún se aplican y, a menudo, debe dar un paso atrás y encontrar una manera de evitar el yeso en primer lugar.

Pero también hay otras formas de lograr esto. Aquí están los más comunes.

La forma correcta (nueva desde Sql Server 2008):

cast(getdate() As Date)

La forma correcta (antiguo):

dateadd(dd, datediff(dd,0, getDate()), 0)

Esto es más antiguo ahora, pero aún vale la pena saberlo porque también se puede adaptar fácilmente a otros puntos de tiempo, como el primer momento del mes, minuto, hora o año.

Esta forma correcta utiliza funciones documentadas que son parte del estándar ansi y se garantiza que funcionan, pero puede ser un poco más lento. Funciona encontrando cuántos días hay desde el día 0 hasta el día actual, y agregando esa cantidad de días al día 0. Funcionará sin importar cómo se almacene su fecha y hora y sin importar cuál sea su configuración regional.

La manera rápida:

cast(floor(cast(getdate() as float)) as datetime)

Esto funciona porque las columnas de fecha y hora se almacenan como valores binarios de 8 bytes. Transmítalos para que floten, bájelos para eliminar la fracción y la parte de tiempo de los valores desaparecerá cuando los vuelva a convertir en fecha y hora. Todo cambia poco a poco sin una lógica complicada y es muy rápido.

Tenga en cuenta que esto depende de un detalle de implementación que Microsoft puede cambiar en cualquier momento, incluso en una actualización automática del servicio. Tampoco es muy portátil. En la práctica, es muy poco probable que esta implementación cambie pronto, pero aún así es importante ser consciente del peligro si elige usarla. Y ahora que tenemos la opción de emitir como fecha, rara vez es necesario.

La forma incorrecta:

cast(convert(char(11), getdate(), 113) as datetime)

El camino equivocado funciona convirtiendo a un stringtruncando el string, y convertir de nuevo a una fecha y hora. Es incorrecto, por dos razones: 1) es posible que no funcione en todas las configuraciones regionales y 2) es la forma más lenta posible de hacer esto… y no solo un poco; es como un orden de magnitud o dos más lento que las otras opciones.


Actualizar Esto ha estado recibiendo algunos votos últimamente, por lo que quiero agregar que desde que publiqué esto, he visto evidencia bastante sólida de que Sql Server optimizará la diferencia de rendimiento entre la forma “correcta” y la forma “rápida”. lo que significa que ahora debería favorecer el primero.

En cualquier caso, desea escriba sus consultas para evitar la necesidad de hacer esto en primer lugar. Es muy raro que deba hacer este trabajo en la base de datos.

En la mayoría de los lugares, la base de datos ya es su cuello de botella. Por lo general, el servidor es el más caro para agregar hardware para mejorar el rendimiento y el más difícil de hacer bien esas adiciones (tiene que equilibrar los discos con la memoria, por ejemplo). También es el más difícil de escalar hacia el exterior, tanto desde el punto de vista técnico como empresarial; es mucho más fácil técnicamente agregar un servidor web o de aplicaciones que un servidor de base de datos e incluso si eso fuera false no paga más de $20,000 por licencia de servidor para IIS o apache.

El punto que estoy tratando de hacer es que, siempre que sea posible, debe hacer este trabajo en el nivel de la aplicación. los solamente El tiempo en el que debería encontrarse truncando una fecha y hora en Sql Server es cuando necesita agrupar por día, e incluso entonces probablemente debería tener una columna adicional configurada como una columna calculada, mantenida en tiempo de inserción/actualización, o mantenida en la aplicación lógica. Saque de su base de datos este trabajo pesado de CPU que rompe índices.

Solo para SQL Server 2008

CAST(@SomeDateTime AS Date) 

Luego transmítelo de nuevo a fecha y hora si quieres

CAST(CAST(@SomeDateTime AS Date) As datetime)

Solo por el bien de una respuesta más completa, aquí hay una forma de trabajo para truncar cualquiera de las partes de la fecha e incluir minutos (reemplazar GETDATE() con la fecha para truncar).

Esto es diferente de la respuesta aceptada en que puede usar no solo dd (días), pero cualquiera de las partes de la fecha (ver aquí):

dateadd(minute, datediff(minute, 0, GETDATE()), 0)

Tenga en cuenta que en la expresión anterior, el 0 es una fecha constante al comienzo de un año (1900-01-01). Si necesita truncar a partes más pequeñas, como segundos o milisegundos, debe tomar una fecha constante que esté más cerca de la fecha que se va a truncar para evitar un desbordamiento.

Puntuaciones y reseñas

Si entiendes que te ha resultado de utilidad nuestro artículo, te agradeceríamos que lo compartas con el resto juniors y nos ayudes a dar difusión a esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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