ДОБАВИТЬ время 23: 59: 59.999 до даты окончания между
У меня возникла проблема с использованием следующего:
Column_Name BETWEEN @StartDate AND @EndDate.
Это связано с тем, что время @EndDate = 00: 00: 00.000, которое не отображает все значения за этот день.
Как бы я преобразовал @EndDate (Всегда 00: 00: 00.000), чтобы всегда быть Date + 23: 59: 59.999?
Ответы
Ответ 1
Один из вариантов, который позволяет избежать необходимости добавления EndDate + 23: 59: 59.999, заключается в том, чтобы не использовать сравнение between
и вместо этого использовать column_name >= @StartDate and column_name < @EndDate +1
Ответ 2
Обратите внимание на точность и округление типа DATETIME в SQL Server 2005:
значения datetime округляются до приращений .000,.003 или .007 секунд
В SQL Server 2008 появился тип DATETIME2, который имеет точность 100 наносекунд. Поэтому в SQL Server 2008 вы можете:
DECLARE @d DATETIME = '2011-10-07 00:00:00.000'
SELECT DATEADD(MS, -1, DATEADD(D, 1, CONVERT(DATETIME2, @d)))
В качестве альтернативы вы можете избежать использования оператора BETWEEN в этом случае:
@StartDate <= Column_Name AND Column_Name < DATEADD(D, 1, @EndDate)
Ответ 3
С появлением типа datetime2
datatype, я боролся с этой проблемой. Чтобы вычислить конец дня как тип данных datetime2, я добавляю количество секунд в день к = date =, а затем вычитаю 100 наносекунд. Вуаля:
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
Теперь я перехожу к типу datetimeoffset
.
Ответ 4
Вы также можете сделать это:
select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0)))
когда @endDate является "5/3/2013"
Ответ 5
Вы можете изменить время в такой дате (я использую getdate()
в качестве примера):
select cast(convert(char(8), getdate(), 112) + ' 23:59:59.99' as datetime)
Пояснение:
convert(char(8), getdate(), 112)
преобразует дату в формат yyyymmdd
(как строку).
Затем вы можете просто добавить нужное время и снова преобразовать всю строку в datetime
.
EDIT:
Это замедляет производительность, когда вы выполняете кастинг в столбце базы данных, да.
Но у него есть переменная datetime, и он просто использует кастинг для изменения времени в переменной один раз
- > Я не вижу проблемы с производительностью, если он использует мой код для изменения его переменной @EndDate
.
Действительная точка, однако. Кастинг не является хорошим решением во всех ситуациях.
Ответ 6
Вы можете использовать between
, если ваша дата окончания установлена на 00:00:00
следующего дня:
ColumnName between @StartDate and convert(datetime, convert(date, @EndDate + 1))
Это преобразует следующий день в date
, который удаляет информацию о часах, затем вы конвертируете его обратно в datetime
, который добавляет информацию о часах по умолчанию: 00:00:00
.
Ответ 7
Сначала я конвертирую исходное datetime в начало дня, затем добавляю часы и секунды:
DECLARE @start DATETIME, @end DATETIME
SET @start = DATEADD (DAY, DATEDIFF (DAY, 0, GETDATE()), 0)
SET @end = DATEADD (HOUR, 23, DATEADD (n, 59, @start))
PRINT @start
PRINT @end
27 октября 2017 г. 12:00
Октябрь 27 2017 23:59