sql - telemundo - el tiempo en los ángeles, california, ee. uu.
AGREGAR el tiempo 23: 59: 59.999 hasta la fecha de finalización entre (7)
Desde la llegada 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 = fecha = y luego resto 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 al tipo de datos datetimeoffset
.
He tenido un problema con el uso de lo siguiente:
Column_Name BETWEEN @StartDate AND @EndDate.
Esto se debe a que @EndDate = 00: 00: 00.000 para el tiempo, que no recoge todos los valores para ese día.
¿Cómo convertiría @EndDate (siempre 00: 00: 00.000) para que siempre sea Date + 23: 59: 59.999?
Primero convierto el datetime original al comienzo del día, luego le agrego horas y segundos:
DECLARAR @start DATETIME, @end DATETIME
SET @start = DATEADD (DAY, DATEDIFF (DAY, 0, GETDATE ()), 0)
SET @end = DATEADD (HORA, 23, DATEADD (n, 59, @start))
IMPRIMIR @start
IMPRIMIR @end
Oct 27 2017 12:00 AM
Oct 27 2017 11:59 PM
Puede usar between
si su 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 en una date
, lo que elimina la información de horas, luego la convierte de nuevo en una datetime
y datetime
que agrega información de hora predeterminada: 00:00:00
.
Puedes cambiar la hora en una fecha como esta (estoy usando getdate()
como ejemplo):
select cast(convert(char(8), getdate(), 112) + '' 23:59:59.99'' as datetime)
Explicación:
convert(char(8), getdate(), 112)
convierte la fecha al formato yyyymmdd
(como cadena).
Luego, solo puede agregar el tiempo deseado y convertir toda la cadena a datetime
nuevamente.
EDITAR:
Se ralentiza el rendimiento cuando se realiza la conversión en una columna de base de datos , sí.
Pero tiene una variable de fecha y hora y solo usa el lanzamiento para cambiar el tiempo en la variable una vez
-> No veo ningún problema de rendimiento si usa mi código para cambiar su variable @EndDate
.
Punto válido, sin embargo. Casting no es una buena solución en todas las situaciones.
También podrías hacer esto:
select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0)))
cuando @endDate es ''5/3/2013''
Tenga en cuenta la precisión y el redondeo del tipo DATETIME en SQL Server 2005:
los valores de fecha y hora se redondean a incrementos de .000, .003 o .007 segundos
SQL Server 2008 introdujo el tipo DATETIME2 que tiene una precisión de 100 nanosegundos. Así que en SQL Server 2008 podrías hacer:
DECLARE @d DATETIME = ''2011-10-07 00:00:00.000''
SELECT DATEADD(MS, -1, DATEADD(D, 1, CONVERT(DATETIME2, @d)))
Como alternativa, puede evitar el operador BETWEEN en este caso:
@StartDate <= Column_Name AND Column_Name < DATEADD(D, 1, @EndDate)
Una opción que evita la necesidad de agregar EndDate + 23: 59: 59.999 es no usar la comparación between
y en su lugar usar column_name >= @StartDate and column_name < @EndDate +1