Esto continúa reuniendo con frecuencia votos adicionales, incluso varios años después, por lo que necesito actualizarlo para las versiones modernas de SQL Server. Para Sql Server 2008 y posterior, es simple:
cast(getDate() As Date)
Tenga en cuenta que los últimos tres párrafos cerca de la parte inferior todavía se aplican, y a menudo necesita 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 (nuevo desde Sql Server 2008):
cast(getdate() As Date)
La forma correcta (antigua):
dateadd(dd, datediff(dd,0, getDate()), 0)
Esto es más antiguo ahora, pero aún vale la pena saberlo porque también puede adaptarse 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 algo más lento. Funciona al encontrar cuántos días hay desde el día 0 hasta el día actual, y agregar esos días de regreso al día 0. Funcionará sin importar cómo se almacene su fecha y hora y cuál sea su ubicación.
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. Conviértalos en flotantes, vuélvalos a piso para eliminar la fracción y la parte de tiempo de los valores desaparecerá cuando los devuelva a la fecha y hora. Todo cambia un poco sin una lógica complicada y es muy rápido.
Tenga en cuenta que esto se basa en 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 en el corto plazo, pero aún es importante tener en cuenta el 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)
La forma incorrecta funciona convirtiendo a una cadena, truncando la cadena y volviendo a convertir a una fecha y hora. Está mal , por dos razones: 1) podría no funcionar en todos los entornos locales y 2) se trata de 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.
Actualización Esto ha estado recibiendo algunos votos últimamente, por lo que quiero agregar que desde que publiqué esto, he visto algunas pruebas bastante sólidas de que SQL Server optimizará la diferencia de rendimiento entre la forma "correcta" y la "rápida". , lo que significa que ahora deberías favorecer a los primeros.
En cualquier caso, desea escribir sus consultas para evitar la necesidad de hacerlo en primer lugar . Es muy raro que haga este trabajo en la base de datos.
En la mayoría de los lugares, la base de datos ya es su cuello de botella. En general, es el servidor más caro para agregar hardware para mejorar el rendimiento y el más difícil para lograr esas adiciones correctamente (por ejemplo, debe equilibrar los discos con la memoria). También es el más difícil de escalar hacia afuera, tanto técnicamente como desde el punto de vista comercial; técnicamente es mucho más fácil agregar un servidor web o de aplicaciones que un servidor de base de datos e incluso si eso fuera falso, no paga más de $ 20,000 por licencia de servidor por IIS o apache.
El punto que estoy tratando de hacer es que, siempre que sea posible, debe hacer este trabajo a nivel de aplicación. El único momento en 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 el momento de inserción / actualización, o mantenida en lógica de aplicación. Saque de su base de datos este trabajo de alto índice de procesamiento de la CPU.
cast(getdate() as date)
?getdate()
Aquí hay un sustituto para cualquier fuente de fecha y hora que pueda tener.Solo para SQL Server 2008
Luego devuélvelo a datetime si quieres
fuente
Solo por el bien de una respuesta más completa, aquí hay una forma de trabajar para truncar cualquiera de las partes de 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), sino cualquiera de las partes de la fecha (ver aquí ):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 a truncar para evitar un desbordamiento.fuente
dateadd(minute, datediff(minute, 0, GETDATE()) / 15 * 15, 0)
El fragmento que encontré en la web cuando tuve que hacer esto fue:
fuente
DateAdd(dd, DateDiff(...), 0)
. Esto puede morderte si no tienes cuidado.En SQl 2005 su función trunc_date podría escribirse así.
(1)
El primer método es mucho más limpio. Utiliza solo 3 llamadas a métodos, incluido el CAST final () y no realiza la concatenación de cadenas, que es un plus automático. Además, no hay modelos de gran tamaño aquí. Si puede imaginar que las marcas de fecha / hora se pueden representar, la conversión de fechas a números y viceversa es un proceso bastante fácil.
(2)
Si le preocupa la implementación de fecha y hora de Microsoft (2) o (3) podría estar bien.
(3)
Tercero, el método más detallado. Esto requiere dividir la fecha en sus partes de año, mes y día, uniéndolas en formato "aaaa / mm / dd", y luego volviendo a una fecha. Este método implica 7 llamadas a métodos, incluido el CAST final (), sin mencionar la concatenación de cadenas.
fuente
fuente
seleccione cast (floor (cast (getdate () como float)) como datetime) Consulte esto: http://microsoftmiles.blogspot.com/2006/11/remove-time-from-datetime-in-sql-server.html
fuente
Para aquellos de ustedes que vinieron aquí buscando una forma de truncar un campo DATETIME a algo menos de un día completo, por ejemplo, cada minuto, pueden usar esto:
así que si hoy fuera
2010-11-26 14:54:43.123
entonces esto volvería2010-11-26 14:54:00.000
.Para cambiar el intervalo al que hace la truca, reemplace 1440.0 con el número de intervalos en un día, por ejemplo:
(Siempre ponga un
.0
extremo para lanzar implícitamente a un flotador).Para aquellos de ustedes que se preguntan para qué
(3.0/86400000)
sirve mi cálculo, SQL Server 2005 no parece emitirFLOAT
conDATETIME
precisión, por lo que esto agrega 3 milisegundos antes de colocarlo en el piso.fuente
datetime2
tipo de datos.Esta consulta debería darle un resultado equivalente a
trunc(sysdate)
en Oracle.¡Espero que esto ayude!
fuente
También puede extraer la fecha
using Substring
de la variable de fecha y hora y volver a la fecha y hora ignorará parte del tiempo.Además, puede acceder a partes de la variable de fecha y hora y combinarlas en una fecha truncada de construcción, algo como esto:
fuente
Oráculo:
Servidor SQL:
Podría usarse de manera similar para truncar minutos u horas de una fecha.
fuente
podrías hacer esto (SQL 2008):
2009-05-28
fuente
TRUNC (aDate, 'DD') truncará los minutos, segundos y horas
SRC: http://www.techonthenet.com/oracle/functions/trunc_date.php
fuente