2008-10-03 9 views

Respuesta

12
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate()))) 

Pensé que tenías C# al principio ... Lo dejaré aquí en caso de que alguien más tropiece con esto.

DateTime now = DateTime.Now; 
DateTime endofDay = now.Date.AddDays(1).AddMilliseconds(-1); 

Puede reemplazar la variable 'ahora' con cualquier día usted está tratando de averiguar

+0

verificación de la etiqueta - que quiere hacerlo en tsql – Danimal

+0

Mejor respuesta OMI –

22

La respuesta es SELECT DATEADD(ms, -3, '2008-01-24'), la explicación se encuentra por debajo.

De Marc's blog:

Pero espera, Marc ... usted dijo que le gusta usar BETWEEN, pero esa consulta no tiene uno ... eso es porque BETWEENis inclusive, lo que significa que incluye final- puntos. Si tuviera una orden vencida a la medianoche del primer día del mes siguiente, estaría incluida. Entonces, ¿cómo se obtiene el valor apropiado para un final de período? Ciertamente es NOT usando partes de fecha para ensamblar una (pero es necesario, recuerde que son las 23: 59: 59.997 como tiempo máximo ... no olvide los milisegundos). Para hacerlo bien, utilizamos el conocimiento incestuoso de que las columnas de Microsoft SQL Server DATETIME tienen como máximo una resolución de 3 milisegundos (algo que no va a cambiar). Entonces, todo lo que hacemos es restar 3 milisegundos de cualquiera de esas fórmulas de fin de período dadas anteriormente. Por ejemplo, el último posible instante de ayer (hora local) es:

SELECT DATEADD(ms, -3, DATEADD(dd, DATEDIFF(dd, 0, GetDate()), 0)) 

Así que para hacer los pedidos que vencen este mes como una consulta BETWEEN, puede utilizar esto:

SELECT [ID] 
    FROM [dbo].[Orders] 
    WHERE [ShipDue] BETWEEN DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()), 0) 
    AND DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()) + 1, 0)) 

Recuerde, siempre asegúrese de hacer las operaciones matemáticas contra los parámetros de entrada, NOT columnas, o matará el SARG -ability de la consulta, lo que significa que los índices que podrían haberse utilizado no lo son.

+0

Lo sentimos, este selecciona la última hora del día antes de la fecha que quería ..... en vez de ese día en particular – test

+0

Esto es ¡estupendo! Una forma realmente, muy fácil de llegar al final del día. – Pandincus

8

Agregar -1 milisegundos al inicio de la próxima los días (incluso soporta DateAdd nanosegundos, si usted desea conseguir bien real).

Pero lo más probable es que solo desee utilizar este valor en una comparación, y en ese caso es incluso más simple.

En lugar de algo como esto:

AND @CompareDate <= [LastTimeforThatday] 

o esto:

@compareDate BETWEEN [StartDate] AND [LastTimeforThatday] 

hacerlo de esta manera:

AND @CompareDate < [BeginningOfNextDay] 

o esto:

AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay]) 
+0

Como dices, excluir el punto final es un enfoque muy estable para estos problemas. También permite que las duraciones se calculen sin fudgear. –

1

¿Por qué volver a entrar?

SELECT DATEADD(ms, 86399997, *yourDate*) 
Cuestiones relacionadas