2016-11-16 2 views
-1

Я ищу для сравнения двух даты-столбцов в SQL Server, например, у меня есть данные, какКак сравнить два значения даты-времени в SQL

TABLEA:

Start Date "2016-11-04 06:00:00.000" 
End Date  "2016-11-04 08:15:00.000" 

И мне нужно, чтобы сравнить значение таблицы а с таблицей B, которая заключается в следующем

TableB:

Start Date "2016-11-01 02:30:00.000" 
End Date  "2016-11-30 08:00:00.000" 

Ожидается, что он не должен совпадать, поскольку конечная дата в TableB больше, чем конечная дата таблицы A.

До сих пор я пробовал, но это не возвращает мне желаемого результата.

(TableA.StartDate BETWEEN TableB.startdatetime AND TableB.enddatetime) 
OR (TableA.EndDate BETWEEN TableB.startdatetime AND TableB.enddatetime) 
OR (TableB.startdatetime BETWEEN TableA.StartDate AND TableB.enddatetime) 
OR (TableB.enddatetime BETWEEN TableA.StartDate AND TableB.enddatetime) 

Любая идея, что я здесь отсутствует ..

С уважением,

+0

Можете ли вы привести пример двух наборов полей datetime, которые должны соответствовать вашему определению «match?»? –

+0

(TableA.StartDate = TableB.startdatetime AND TableA.EndDate = TableB.EndDate) будет истинным, если соответствующие значения start и enddates равны. Помещение НЕ впереди вернет true, если это не так. –

+0

У вас есть две границы дат, что означает, что существует шесть разных способов, которыми они могут быть связаны: 1. Один период полностью предшествует другому; 2. один период перекрывает время начала; 3 Один период перекрывает время окончания; 4. Один период полностью в течение другого периода; 5. Периоды прекрасно сочетаются; 6. Один период полностью после второго периода. Ваш пример - номер 4. Что именно вы пытаетесь сопоставить? –

ответ

0

Мне удалось решить проблему, используя условие ниже. Я думаю, что SQL Server рассматривает только часть Date, если мы попытаемся сравнить ее с Time. Поэтому мне пришлось отделить часть времени, чтобы сравнить ее.

TableA.StartDate >= TableB.startdatetime AND TableA.StartDate <= TableB.enddatetime 
    AND TableA.EndDate >= TableB.startdatetime AND TableA.EndDate <= TableB.enddatetime 
    AND (CAST(TableA.StartDate AS time) BETWEEN CAST(TableB.startdatetime AS time) 
    AND CAST(TableB.enddatetime AS time)) 
    AND (CAST(TableA.EndDate AS time) BETWEEN CAST(TableB.startdatetime AS time) 
    AND CAST(TableB.enddatetime AS time)) 
0

Если я правильно понимаю ваш вопрос, вы пытаетесь найти 2 значения в TABLEA, которые существуют вместе в TableB (как ST, так и ED в той же записи.) Я предполагаю, что две таблицы не имеют другого подходящего значения, кроме этих двух точных совпадений даты, например уникальный идентификатор.

После небольшого тестирования:

select st, ed 
from tableA 
where exists (select st, ed from tableB) 

Возвращает каждое значение. Бесполезный.

select * from 
tableA a join 
tableB b on a.st = b.st 
and a.ed = b.ed 

Возвращает миллионы матчей, бесполезно. В таблице всего 1000 записей.

select * from 
tableA a join 
tableB b on a.st = b.st 
and a.ed = b.ed 
and a.id = b.id 

возвращает 27 совпадений. Правильный ответ.

Надеюсь, это поможет.

+0

Это не соответствует, это должно быть дата и время сравнение между двумя значениями. – Arayn

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