Подтвердить что ты не робот

ДОБАВИТЬ время 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?

4b9b3361

Ответ 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