2011-10-07 32 views
13

He estado teniendo un problema con el uso de lo siguiente:tiempo ADD 23: 59: 59,999 la fecha final, para entre

Column_Name BETWEEN @StartDate AND @EndDate. 

Esto es porque el @EndDate = 00: 00: 00.000 para el tiempo, lo cual no recoge todos los valores para ese día.

¿Cómo convertiré @EndDate (Siempre 00: 00: 00.000) para que siempre sea Fecha + 23: 59: 59.999?

Respuesta

21

Una opción que evita la necesidad de añadir EndDate + 23: 59: 59.999 es no utilizar la comparación between y en su lugar utilizar column_name >= @StartDate and column_name < @EndDate +1

+11

1 'EndDate + 23: 59: 59.999' conseguiría redondeado al día siguiente de todos modos. Tendría que ser 'EndDate + 23: 59: 59.997' para evitar eso. –

+8

Todavía iría con 'y column_name

+0

<@EndDate +1 debería dar como resultado valores que coincidan para EndDate hasta EndDate + 23: 59: 59.999. – dave

2

Puede cambiar el tiempo en una fecha como esta (estoy usando como getdate() un ejemplo):

select cast(convert(char(8), getdate(), 112) + ' 23:59:59.99' as datetime) 

Explicación:

convert(char(8), getdate(), 112) convierte la fecha a yyyymmdd formato (como cadena).

Luego puede agregar el tiempo deseado y convertir toda la cadena en datetime nuevamente.


EDIT:

Se frena el rendimiento cuando se hace la colada en una columna de la base de datos , sí.
pero él tiene una fecha y hora variable de y él sólo utiliza el casting para cambiar la hora en la variable vez
-> No veo ningún problema de rendimiento si se utiliza el código para cambiar su variable de @EndDate.

Punto válido, sin embargo. Casting no es una buena solución en todas las situaciones.

+0

fundición entre datetime y varchar realmente ralentiza el rendimiento. Deberías tratar de evitar eso a menos que sea necesario. También se aplica a otras sobretensiones –

6

Tenga en cuenta la precisión y redondeo del tipo DATETIME en SQL Server 2005:

los valores de fecha y hora se redondean en incrementos de .000, .003, .007 segundos o

SQL Server 2008 introdujo el tipo DATETIME2 que tiene una precisión de 100 nanosegundos. Así que en SQL Server 2008 que podría hacer:

DECLARE @d DATETIME = '2011-10-07 00:00:00.000' 
SELECT DATEADD(MS, -1, DATEADD(D, 1, CONVERT(DATETIME2, @d))) 

Alternativamente es posible que desee evitar que el operador BETWEEN en este caso:

@StartDate <= Column_Name AND Column_Name < DATEADD(D, 1, @EndDate) 
3

También puede hacer esto:

select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0))) 

cuando @endDate es '5/3/2013'

+0

Esta hizo que sea mucho más fácil editar mi consulta actual. Solo necesitaba editar la línea donde hice mi variable, en lugar de volver atrás y deshacerme de '=' en todas partes. – tarheel

4

Desde el advenimiento del tipo de datos datetime2, he estado luchando con este problema. Para calcular el final del día como un tipo de datos datetime2 agrego el número de segundos en un día a la fecha = luego restar 100 nanosegundos.Voila:

declare @bod datetime2 

declare @eod datetime2 

set @bod = cast (GETDATE() as DATE) 

set @eod = DATEADD(ns, -100, DATEADD(s, 86400, @bod)) 

print @bod 

print @eod 

-- answer: 

2013-12-01 00:00:00.0000000 

2013-12-01 23:59:59.9999999 

Ahora me voy a datetimeoffset tipo de datos.

+0

Lo siento, pero esto supone que está usando un tipo 'datetime2', que creo que no está disponible para SQL Server 2005 (aunque es probable que se haya actualizado desde la publicación inicial de esta pregunta). Más allá de eso, hay una serie de cosas raras que ocurren cuando se lanzan [tipos de fecha/hora/indicación de la hora en SQL Server] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between -y-el-diablo-tiene-en-común.aspx). Esto también ilustra una idea errónea comúnmente aceptada sobre los rangos, por lo que defiendo evitar 'BETWEEN 'en conjunto. –

1

Puede utilizar between si la fecha de finalización se establece en 00:00:00 del día siguiente:

ColumnName between @StartDate and convert(datetime, convert(date, @EndDate + 1))

Esto convierte el día siguiente a una date, lo que elimina la información de hora, entonces convertirlo de nuevo a datetime que agrega información de hora predeterminada: 00:00:00.

-1

por primera vez convertir la fecha y hora originales para comenzar del día, a continuación, añadir horas y segundos a la misma:

DECLARE @Start DATETIME, @end DATETIME

SET @Start = DATEADD (DIA, DATEDIFF (DÍA, 0, GETDATE()), 0)

SET @end = DATEADD (hora, 23, DATEADD (n, 59, @Start))

PRINT @Start

PRINT @end

Oct 27 de 2017 12:00a.m.

Oct 27 de 2017 23:59

Cuestiones relacionadas