Asp.net ISNULL日期月份

Asp.net ISNULL日期月份,asp.net,datetime,isnull,Asp.net,Datetime,Isnull,我有两个下拉列表,一个是月,另一个是年。用户为要检索的项目选择提交月份和年份。在数据库中完整输入日期,如2009年12月1日。下拉列表中有“所有年份”和“所有月份”选项,但当用户选择其中一个时,将得到空结果。非常感谢。这是我的疑问: SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth FROM Items WHERE (YEAR(Submit) LIKE ISNULL(@YearPay, ''))

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

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (YEAR(Submit) LIKE ISNULL(@YearPay, ''))
 AND (MONTH(Submit) LIKE ISNULL(@MonthPay, ''))
我的参数是:


这里有一种解决问题的方法:

 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。

这里有一种解决问题的方法:

 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。

一个相当快速的方法是确保@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代码根据所选的下拉项生成“到”和“从”日期

e、 g

选择ItemID,年(提交)作为SubmitYear,月(提交)作为SubmitMonth
从项目
其中(提交>=@FromDate或@FromDate为空)
和(提交<@ToDate或@ToDate为空)
因此,使用以下示例进行月/年选择:
2009年1月将产生@FromDate='2009-01-01',@ToDate-'2009-02-01'
2009年的任何月份都会产生@FromDate='2009-01-01',@ToDate='2010-01-01'

任何月份、任何年份的结果=@FromDate=NULL、@ToDate=NULL

一个相当快速的方法是确保@YearPay和@MonthPay是整数数据类型,然后传入(例如)-1表示“全部”,因此您的查询将变成:

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代码根据所选的下拉项生成“到”和“从”日期

e、 g

选择ItemID,年(提交)作为SubmitYear,月(提交)作为SubmitMonth
从项目
其中(提交>=@FromDate或@FromDate为空)
和(提交<@ToDate或@ToDate为空)
因此,使用以下示例进行月/年选择:
2009年1月将产生@FromDate='2009-01-01',@ToDate-'2009-02-01'
2009年的任何月份都会产生@FromDate='2009-01-01',@ToDate='2010-01-01'
任何月份、任何年份的结果都是@FromDate=NULL、@ToDate=NULL

select * from sys.tables where name like ''
还有这个

select * from sys.tables where name like '%%'
话虽如此,我完全同意内巴卡尼泽的评论(和解决方案)。

试试这个

select * from sys.tables where name like ''
还有这个

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

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

为什么在where条款中需要like?这从来都不是部分匹配,对吧?你很好,谢谢你的帮助。为什么你需要where子句中的like?它从来不是部分匹配,对吗?你很好,谢谢你的帮助。请注意性能,通过在Submit字段上进行函数调用来获取年份和月份,你会发现索引没有多大用处。如果您有大量数据,可能会受到严重影响请注意性能,通过对Submit字段进行函数调用来获取年份和月份,您会发现索引没有多大用处。如果你有大量的数据,可能会受到很大的伤害