Путаница в SQL-запросе для даты начала и окончания

У меня есть таблица (например, tableA), например:

| Name  | Startdate  |  Enddate   |
|---------------------------------|
|  a    | 2012-07-01 | 2013-06-30 |
|  b    | 2011-05-01 | 2012-04-30 |
|  c    | 2010-01-01 | 2013-12-31 |
|  d    | 2013-01-01 | 2014-12-31 |
|  e    | 2011-07-01 | 2012-06-30 |

Я хочу получить имя из таблицы, кто активен между 2012-05-01 и 2012-10-31. Из приведенной выше таблицы результат должен быть a,c и e.

Я сделал следующее:

SELECT Name FROM tableA WHERE startdate<='2012-05-01' AND enddate>='2012-10-31'

Но я не получаю правильный результат.


person Himanshu Jansari    schedule 12.07.2012    source источник
comment
справа должно быть: startdate›='2012-05-01' AND enddate‹='2012-10-31'   -  person rad    schedule 12.07.2012
comment
Хотите, чтобы результаты были действительны в течение всего периода?   -  person RobB    schedule 12.07.2012
comment
@RobB Да. Мне нужны результаты, действительные для данного периода (между 2012-05-01 и 2012-10-31)   -  person Himanshu Jansari    schedule 12.07.2012
comment
Некоторое время не использовали ms-sql, но в оракуле вам нужно будет преобразовать строку «2012-05-01» в дату, прежде чем вы сможете сравнить даты, иначе вы в конечном итоге сравните строки, такие как «a»‹'b' .   -  person Kamal    schedule 12.07.2012
comment
@ hims056, какой тип данных у startdate и enddate?   -  person Vishwanath Dalvi    schedule 12.07.2012
comment
Вы должны использовать правильный, независимый от языка формат для указания только дат против DATETIME - и этот формат yyyyMMdd - поэтому попробуйте: ...WHERE startdate <= '20120501' AND enddate >= '20121031'. Формат с дефисами небезопасен и может быть неверно истолкован в зависимости от языковых настроек вашего SQL Server. Кроме того, ваши операторы сравнения также должны быть обратными — они должны быть больше или равны 20120501 и меньше или равны 20121031 — верно?   -  person marc_s    schedule 12.07.2012
comment
@ hims056, а какой результат вы получаете?   -  person Vishwanath Dalvi    schedule 12.07.2012
comment
Поскольку никто не упомянул об этом ни в одном из своих ответов, лучше избегать указания дат (без времени) как YYYY-MM-DD - они могут быть неоднозначными для SQL Server. Лучше просто использовать YYYYMMDD без символов-разделителей.   -  person Damien_The_Unbeliever    schedule 12.07.2012
comment
@marc_s и @Damien_The_Unbeliever Правильно, я буду использовать yyyyMMDD   -  person Himanshu Jansari    schedule 12.07.2012


Ответы (3)


Размещение оператора сравнения создавало проблему, проверьте это

SELECT Name FROM tableA WHERE startdate>='2012-05-01' AND enddate<='2012-10-31'
person Deepesh    schedule 12.07.2012
comment
Вы должны попробовать этот запрос к данным. Он вообще не возвращает никаких строк. - person Mikael Eriksson; 12.07.2012
comment
@MikaelEriksson Этого не произойдет, потому что таблица не содержит записей в указанном диапазоне дат. Поскольку он задал вопрос, запись активна между активными между «2012-05-01» и «2012-10-31», означает, что дата начала записи должна быть больше или равна 2012-05-01, но если вопрос должен иметь все записи, в которых встречается этот диапазон дат, тогда ваш запрос правильный. Может я неправильно выразился!!! - person Deepesh; 12.07.2012
comment
ВЫБЕРИТЕ имя ИЗ таблицы 1, ГДЕ дата начала между «2012-05-01» И «2012-10-31» или дата окончания между «2012-05-01» И «2012-10-31» - person Deepesh; 12.07.2012
comment
ОП хочет перекрывающиеся диапазоны дат. Не совсем в интервале. - person Mikael Eriksson; 12.07.2012
comment
@Deepesh Смотрите вопрос еще раз. Мне нужен результат, в котором '2012-05-01' и '2012-10-31' существуют между датой начала и датой окончания. - person Himanshu Jansari; 12.07.2012

Если вы хотите найти какие-либо результаты, полученные за этот период, используйте МЕЖДУ:

SELECT Name FROM tableA WHERE startdate BETWEEN '2012-05-01' and '2012-10-31'

BETWEEN возвращает TRUE, если значение test_expression больше или равно значению begin_expression и меньше или равно значению end_expression.

NOT BETWEEN возвращает TRUE, если значение test_expression меньше значения begin_expression или больше значения end_expression.

person RobB    schedule 12.07.2012
comment
Если я использую startdate BETWEEN '2012-05-01' and '2012-10-31', я не получу a, так как он активен в этот период. - person Himanshu Jansari; 12.07.2012
comment
Согласно вашему вопросу a имеет дату окончания "2013-06-30". Выражение BETWEEN вернет совпадение только в том случае, если обе даты начала и окончания находятся в пределах (между) указанных дат. - person RobB; 12.07.2012

person    schedule
comment
Я получил результат, который хотел. Посмотреть эту скрипту - person Himanshu Jansari; 12.07.2012
comment
Новая скрипта с форматом даты yyyyMMdd обновляется здесь - person Himanshu Jansari; 12.07.2012
comment
Я хочу проголосовать за это ++++. Казалось бы, просто, но когда вы какое-то время смотрите на такого рода проблемы, вы не совсем их видите. Спасибо. - person Mike; 12.02.2013