sql-server - primer - operaciones con fechas sql
¿Cómo puedo obtener la última hora posible de un día en particular? (4)
Agregue -1 milisegundos al inicio del día siguiente (DateAdd incluso admite nanosegundos, si desea obtener realmente bien).
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]
Hazlo asi:
AND @CompareDate < [BeginningOfNextDay]
o esto:
AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])
Estoy tratando de lograr la última hora posible de un día en particular, por ejemplo, para la Fecha de 2008-01-23 00: 00: 00,000 necesitaría el 2008-01-23 23: 59: 59.999 quizás usando la función dateadd en la Fecha ¿campo?
La respuesta es SELECT DATEADD(ms, -3, ''2008-01-24'')
, la explicación está debajo.
Desde el blog de Marc :
Pero espera, Marc ... dijiste que te gusta usar
BETWEEN
, pero esa consulta no tiene uno ... eso es porqueBETWEEN
es inclusivo , lo que significa que incluye los puntos finales. 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 NO es mediante el uso de partes de fecha para montar uno (pero es obligatorio, 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 columnasDATETIME
Microsoft SQL Server 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 instante posible de ayer (hora local) es:
SELECT DATEADD(ms, -3, DATEADD(dd, DATEDIFF(dd, 0, GetDate()), 0))
Entonces, para hacer los pedidos que vencen este mes como una consulta
BETWEEN
, puede usar 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, NO las columnas, o matará la capacidad SARG de la consulta, lo que significa que los índices que podrían haber sido utilizados no lo son.
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate())))
Pensé que tenías c # al principio ... Dejaré esto 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 el día que intente averiguar
¿Por qué volver a ella?
SELECT DATEADD(ms, 86399997, *yourDate*)