2015-02-23 1 views
3

У меня есть таблица tblBranchTimingEntryПроверьте дату перекрывается в SQL

+---------------+-------------------------+-------------------------+------------------+ 
| BranchEntryID |  fromDate   |   toDate   |  SundayIn  | 
+---------------+-------------------------+-------------------------+------------------+ 
|   24 | 2015-01-01 00:00:00.000 | 2015-01-31 00:00:00.000 | 12:00:00.0000000 | 
|   24 | 2015-02-01 00:00:00.000 | 2015-02-15 00:00:00.000 | 12:00:00.0000000 | 
|   24 | 2015-03-01 00:00:00.000 | 2015-03-31 00:00:00.000 | 00:00:00.0000000 | 
|   24 | 2014-01-01 00:00:00.000 | 2014-12-31 00:00:00.000 | 00:00:00.0000000 | 
+---------------+-------------------------+-------------------------+------------------+ 

Requirement

Я даю вход BranchEntryID, FromDate, Todate и я хочу, чтобы проверить, если дата между fromDate и toDate over lap с диапазонами дат, хранящимися в tblBranchTimingEntry.


То, что я сделал до сих пор

У меня есть этот запрос,

SELECT 
     * 
    FROM 
     [dbo].[tblBranchTimingEntry] 

    WHERE 
     BranchEntryId = 24 
    AND 
     ('2015-01-14' BETWEEN fromDate AND toDate OR '2015-02-28' BETWEEN fromDate AND toDate) 

Это будет проверять перекрытие.


Проблема

Это будет работать, только если дата ввода падает между датами, присутствующих в БД. В этом примере это не удастся.

Предположим, что я даю fromdate и todate как '2015-02-16' и '2015-08-27', Этот запрос ничего не вернет. Но между этими датами встречаются даты.

Любое решение?

+0

возможно дубликат [Определить, является ли двух диапазонов дат Перекрытие] (HTTP: // StackOverflow .com/вопросы/325933/определяет, является ли-два-дата-диапазоны-перекрытие) – Magnus

ответ

2

Попробуйте эту логику:

SELECT te.* 
FROM [dbo].[tblBranchTimingEntry] te 
WHERE BranchEntryId = 24 AND 
     '2015-01-14' < toDate AND 
     '2015-02-28' > fromDate; 

В зависимости от того, что вы имеете в виду под "перекрытием", которые могли бы быть <= и/или >=.

Логика: два перекрытия диапазона дат - это первые запуски до второго конца, а первые заканчиваются после второго запуска.

1

Попробуйте это:

SELECT 
     * 
FROM 
     [dbo].[tblBranchTimingEntry] 
WHERE 
    BranchEntryId = 24 
AND 
    (('2015-01-14' < toDate AND 
    '2015-01-14' > fromDate) or ('2015-02-28' > fromDate and '2015-02-28' < toDate) or ('2015-02-28' > toDate AND 
    '2015-01-14' < fromDate)) 

Таким образом, вы проверяете, если какой-либо из дат betwwen FromDate и ToDate

Смежные вопросы