ДОБАВИТЬ время 23: 59: 59.999 до даты окончания между - PullRequest
18 голосов
/ 07 октября 2011

У меня возникла проблема с использованием следующего:

Column_Name BETWEEN @StartDate AND @EndDate. 

Это потому, что @EndDate = 00: 00: 00.000 для времени, которое не собирает все значения для этого дня.

Как мне преобразовать @EndDate (всегда 00: 00: 00.000) в всегда Date + 23: 59: 59.999?

Ответы [ 7 ]

31 голосов
/ 07 октября 2011

Один из вариантов, позволяющий избежать добавления EndDate + 23: 59: 59,999, - это не использовать сравнение between, а вместо этого использовать column_name >= @StartDate and column_name < @EndDate +1

10 голосов
/ 07 октября 2011

Обратите внимание на точность и округление типа DATETIME в SQL Server 2005:

значения даты и времени округляются с шагом в .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)
5 голосов
/ 02 декабря 2013

С появлением типа данных datetime2 я боролся с этой проблемой.Чтобы вычислить конец дня как тип данных 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 тип данных.

3 голосов
/ 03 мая 2013

Вы также можете сделать это:

select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0)))

когда @endDate равен '5/3/2013'

3 голосов
/ 07 октября 2011

Вы можете изменить время на такой дате (я использую getdate() в качестве примера):

select cast(convert(char(8), getdate(), 112) + ' 23:59:59.99' as datetime)

Пояснение:

convert(char(8), getdate(), 112) преобразует дату в формат yyyymmdd (в виде строки).

Затем вы можете просто добавить желаемое время и снова преобразовать всю строку в datetime.


EDIT:

Это замедляет производительность, когда вы выполняете приведение к столбцу базы данных , да.
Но у него есть переменная datetime , и он просто использует приведение, чтобы один раз изменить время в переменной
-> Я не вижу проблем с производительностью, если он использует мой код для изменения своей переменной @EndDate.

Допустимая точка, однако. Кастинг не является хорошим решением во всех ситуациях.

1 голос
/ 26 августа 2014

Вы можете использовать between, если ваша дата окончания установлена ​​на 00:00:00 следующего дня:

ColumnName between @StartDate and convert(datetime, convert(date, @EndDate + 1))

Это преобразует следующий день в date,который удаляет информацию о часах, затем вы конвертируете ее обратно в datetime, который добавляет информацию о часах по умолчанию: 00:00:00.

0 голосов
/ 28 октября 2017

Сначала я преобразовываю исходную дату и время в начало дня, затем добавляю к нему часы и секунды:

ОБЪЯВИТЬ @start DATETIME, @end DATETIME

SET @start = DATEADD (DAY, DATEDIFF (DAY, 0, GETDATE ()), 0)

SET @end = DATEADD (ЧАС, 23, DATEADD (n, 59, @start))

PRINT @ start

PRINT @ end

27 октября 2017 г. 12:00 AM1013*

27 октября 2017 11:59 PM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...