Получить все записи на основе диапазона дат - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу запросить данные таблицы ниже на основе диапазона дат.

Id      | DateFrom    |  DateTo
--------+-------------+-------------
1       | 2019-09-15  |  2019-09-17
2       | 2019-09-20  |  2019-09-20
3       | 2019-09-21  |  2019-09-21
4       | 2019-09-22  |  2019-09-22
5       | 2019-09-20  |  2019-09-22

Я написал этот запрос для фильтрации данных, и я не получаю никаких данных.

DECLARE @StartDate DateTime = '09/02/2019' -- MM/DD/YYYY
DECLARE @EndDate DateTime = '09/20/2019'

SELECT * 
FROM MyTable 
WHERE (@StartDate BETWEEN DateFrom AND DateTo) 
   OR (@EndDate BETWEEN DateFrom AND DateTo)

На выходе должно быть 1, 4, 5 записей.

Если @StartDate и @EndDate равны '09/21/2019', то на выходе должно быть 3, 5.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019
Below query serve my purpose. However, below query returns duplicates.. and handled distinct in c#.

SELECT * 
FROM MyTable
WHERE (DateFrom BETWEEN ''' + @DateFrom + ''' AND ''' + @DateTo + ''') 
  OR (DateTo BETWEEN ''' + @DateFrom + ''' AND ''' + @DateTo + ''')
  OR (''' + @DateFrom + ''' BETWEEN DateFrom AND DateTo) 
  OR (''' + @DateTo + ''' BETWEEN DateFrom AND DateTo)
0 голосов
/ 20 сентября 2019

Поскольку форматы даты могут быть разными на каждой машине, я предлагаю вам использовать DATEFROMPARTS(year, month, day) вместо литеральной строки.

Используйте это так:

DECLARE @StartDate DateTime = DATEFROMPARTS(2019, 2, 9) ;
DECLARE @EndDate DateTime = DATEFROMPARTS(2019, 9, 20) ;
0 голосов
/ 19 сентября 2019

Вы полагаетесь на настройки сеанса базы данных здесь.Это '09 / 02/2019 '2 февраля или 9 сентября?Позволяет ли настройка '/' быть разделителем части даты?Лучше использовать однозначный формат.Это 'YYYYMMDD' для всех версий SQL Server (или 'YYYY-MM-DD' для более новых).

Тогда, какого типа столбцы даты?Если они на самом деле даты и время, то могут быть части времени, которые вы не видите.Вы можете сыграть на сегодняшний день, чтобы играть безопасно.

DECLARE @StartDate DateTime = '2019-09-02'
DECLARE @EndDate DateTime = '2019-09-20'

SELECT * 
FROM MyTable
WHERE (@StartDate BETWEEN CAST(DateFrom AS DATE) AND CAST(DateTo AS DATE)) 
   OR (@EndDate BETWEEN CAST(DateFrom AS DATE) AND CAST(DateTo AS DATE));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...