0

我有两个下拉列表,一个带有月份,另一个带有年份。用户选择他们想要检索的项目的提交月份和年份。在数据库中输入完整的日期,例如。2009 年 1 月 12 日。下拉列表中有“所有年份”和“所有月份”选项,但是当用户选择其中任何一个时,他们会得到空结果。非常感谢。这是我的查询:

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" />

4

3 回答 3

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。

于 2009-12-10T17:24:15.920 回答
1

一种相当快速的方法是确保 @YearPay 和 @MonthPay 是 INTEGER 数据类型,然后传入(例如)-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 年 1 月将导致 @FromDate = '2009-01-01'、@ToDate - '2009-02-01' 2009 年的
任何月份都会导致 @FromDate = '2009 -01-01', @ToDate = '2010-01-01'
任何月份,任何年份都会产生 = @FromDate = NULL, @ToDate = NULL

于 2009-12-10T17:27:38.583 回答
0

尝试这个

select * from sys.tables where name like ''

和这个

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

话虽如此,我完全同意 Nebakanezer 的评论(和解决方案)。

于 2009-12-10T17:30:26.940 回答