2009-12-10 3 views
0

У меня есть два dropdownlists, один с месяцами, а другой с годом. Пользователь выбирает месяц и год отправки для элементов, которые они хотят получить. В базе данных дата вводится полностью, например. 01/12/2009. В раскрывающихся списках есть опция «Все годы» и «Все месяцы», но когда пользователи выбирают либо они получают нулевые результаты. Большое спасибо. Это мой запрос:ISNULL Дата месяца

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (YEAR(Submit) LIKE ISNULL(@YearPay, '')) 
AND (MONTH(Submit) LIKE ISNULL(@MonthPay, '')) 

Мой параметр являются:

<asp:ControlParameter ControlID="DropDownList1" DefaultValue="" Name="YearPay" PropertyName="SelectedValue" />

<asp:ControlParameter ControlID="DropDownList2" DefaultValue="" Name="MonthPay" PropertyName="SelectedValue" />

+2

Зачем вам нужно, как в разделе where? Это никогда не частичный матч, не так ли? –

+0

вы заблуждаетесь, спасибо за вашу помощь. – Anelim

ответ

5

Вот один из способов решить эту проблему:

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (YEAR(Submit) = @YearPay OR @YearPay IS NULL) 
AND (MONTH(Submit) = @MonthPay OR @MonthPay IS NULL) 

Таким образом, если вы перейдите в NULL для любой переменной, эту часть Предложение WHERE вернет true.

+0

Помните о производительности, выполняя вызовы функций в поле «Подтверждение», чтобы получить год и месяц, вы обнаружите, что индексы не будут очень полезны. Может быть очень плохо, если у вас много данных – AdaTheDev

1

Один довольно быстрый способ, чтобы убедиться, что @YearPay и @MonthPay являются целочисленными типами данных, а затем передать в (например) -1, чтобы указать «ALL», так что ваш запрос станет:

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (YEAR(Submit) = @YearPay OR @YearPay = -1) 
AND (MONTH(Submit) = @MonthPay OR @MonthPay = -1) 

Однако, для общей производительности я лично избегаю этого, используя YEAR() и MONTH(), так как вы не получите хорошего использования индекса. Вместо этого у меня возникнет соблазн изменить запрос, чтобы просто принять диапазон дат, в соответствии с которым даты и даты генерируются вашим кодом .NET на основе выбранных элементов выпадающего списка.

например.

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (Submit >= @FromDate OR @FromDate IS NULL) 
    AND (Submit < @ToDate OR @ToDate IS NULL) 

Таким образом, используя следующие примеры за месяц/год выборов:
января 2009 приведет к @FromDate = '2009-01-01', @ToDate - '2009-02-01'
Любой месяц, 2009 приведет к @FromDate = '2009-01-01', @ToDate = '2010-01-01'
Любой месяц, любой год приведет = @FromDate = NULL, @ToDate = NULL

0

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

select * from sys.tables where name like '' 

и это

select * from sys.tables where name like '%%' 

Это сказанное, я полностью согласен с комментарием Nebakanezer (и решения).

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