SQL Server: включить последнюю дату в диапазоне между датами - PullRequest
0 голосов
/ 19 мая 2019

У меня есть средство выбора даты ОТ ДАТЫ и ДО ДАТЫ.

Если пользователь вводит FROM = 5/10/2019 и TO = 5/19/2019, данные возвращаются только до 5/18, но не включают 5/19 data.

Я также хотел бы включить 5/19.

У меня есть этот код T-SQL:

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND DATE <= '5/19/2019'

Но моя проблема в том,что если в ТАБЛИЦЕ дата 5/19, она не будет отображаться

Так что мне нужно что-то вроде этого?

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND DATE <= (('5/19/2019') + 1)

Мне нужно также включить последнюю дату.

Ответы [ 3 ]

3 голосов
/ 19 мая 2019

Ваш столбец даты, вероятно, содержит компонент времени.Самый безопасный метод:

WHERE DATE >= '2019-05-10' AND
      DATE < '2019-05-20'  -- note one day later

Вы можете выразить это как:

WHERE DATE >= '2019-05-10' AND
      DATE < DATEADD(DAY, 1, '2019-05-20')

Таким образом, вы можете захватить нужные вам входные данные.

SQL Server будет использовать индексыдля преобразований на сегодняшний день также целесообразно сделать:

WHERE CONVERT(DATE, DATE) >= '2019-05-10' AND
      CONVERT(DATE, DATE) <- '2019-05-19' 

В большинстве баз данных такие преобразования исключают использование индексов, но SQL Server является исключением.

1 голос
/ 19 мая 2019

Вы можете просто изменить запрос, чтобы он отображал только те, которые меньше (измените <= на <), а затем увеличить дату на один день:

SELECT * FROM TABLE WHERE DATE >= '5/10/2019' and DATE < '5/20/2019'

Вы можете увеличить свой день на один, используя функцию DATEADD()

0 голосов
/ 20 мая 2019

Все зависит от типа столбца «ДАТА». Исходя из того, что вы объяснили, я предполагаю, что DATE имеет тип datetime, datetime2 типа datetimeoffset. В том случае, когда вы пишете:

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND DATE <= '5/19/2019'

На самом деле это означает:

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019 00:00:00' AND DATE <= '5/19/2019 00:00:00'

Вот почему вы не включили 19 мая в результаты (на самом деле, но только в полночь 19 мая). Таким образом, есть два способа решить эту проблему (игнорируя производительность):

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND DATE <= DATEADD(DAY, 1, '5/19/2019')

или

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND cast(DATE as date) <= '5/19/2019'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...