2009-12-10 199 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子句中使用?这绝对不是部分匹配,对吧? – 2009-12-10 17:21:58

+0

你很好,谢谢你的帮助。 – Anelim 2009-12-10 17:53:56

回答

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 2009-12-10 17:35:33

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的评论(和解决方案)达成一致。