Что не так с этим предложением sql where? - PullRequest
2 голосов
/ 04 июня 2010

Я выбираю записи на основе двух дат в одном и том же столбце, но в моем условии, где не удается выбрать записи для StartDate и EndDate ...

where CreatedDate between @StartDate and @EndDate

Я получаю только записи между датами, а не записи StartDate и EndDate ... Подумайте, если я пропущу ту же дату, что и StartDate и EndDate, я смогу выбрать все записи на эту дату. Есть предложения?

Ответы [ 5 ]

3 голосов
/ 04 июня 2010

Со страницы MSDN о BETWEEN:

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

Я бы сказал, что @StartDate и @EndDate, вероятно, не соответствуют вашим ожиданиям - тип данных DateTime включает часы, минуты, секунды и миллисекунды, и их также следует указывать, если вы хотите получить согласованные результаты. 1013 *

См. этот ответ для более подробной информации.

1 голос
/ 04 июня 2010

см. Этот вопрос: Включает ли MS SQL Server «между» границы диапазона? ; Я думаю, что ваша проблема может быть временем, как объяснено в этом ответе

1 голос
/ 04 июня 2010

BETWEEN - включительно. Какие даты вы указываете? Помните, что DATETIME с точностью до миллисекунды, поэтому, если ваши даты отклонены на миллисекунду, вы не сможете выбрать "равную" часть.

Вы должны иметь возможность вручную настроить @StartDate и @EndDate, чтобы делать то, что вы хотите, так:

SET @StartDate = CAST(FLOOR(CAST(@StartDate AS FLOAT)) AS DATETIME)
SET @EndDate = CAST(FLOOR(CAST(@StartDate AS FLOAT) + 1) AS DATETIME)

...
WHERE
   CreatedDate BETWEEN @StartDate AND @EndDate
0 голосов
/ 01 ноября 2014

Я думаю, у вас есть время, прикрепленное к дате. Если да, попробуйте преобразовать или разыграть его. ИЛИ Возможно, вы храните дату в колонке Varchar.

Предложение Between вернет TRUE, если записи ОТ даты начала и окончания Это означает, что он включает в себя дату начала и окончания.

0 голосов
/ 04 июня 2010

Помните, что SQL Server DATETIME включает компонент времени, и , если вы не укажете время, по умолчанию используется полночь - и полночь - это первое мгновение этого дня.

В практическом плане, если вы сказали BETWEEN '6/3/2010' AND '6/4/2010', то единственные записи за 6/4, которые вы увидите, это записи, которые произошли 4/4/2010 в 00:00:00. Если у вас есть запись 6/4 в 12:34, она не будет возвращена.

Лучшее решение - это (A) использовать явные> и <; и (B) использовать математику даты, чтобы получить правильную конечную точку, если вы используете только даты без времени. E.g.:</p>

WHERE order_date >= @StartDate
AND   order_date <  CAST(FLOOR(CAST(@StartDate AS FLOAT)) AS DATETIME) + 1
...