我的ASP.Net应用程序中有一个日期搜索字段,用户输入他要查找的日期,SQL查询查找提供的确切日期。
我被要求允许用户使用通配符输入日期搜索,如下所示:
- */12/2015
将意味着2015年12月的所有月份
- */*/2015
意味着2015年全年
- */*/*
意味着获得所有数据
我能想到的唯一方法是在日期中查看我的C#代码中的'*',如果它存在,我会根据{{1}的位置将日期范围替换为查询}。
这个解决方案对我来说看起来不实用,在C#或SQL中有更简单的方法吗?
答案 0 :(得分:2)
您找到的解决方案是正确处理信息时唯一有意义的解决方案。
你被要求的是给用户一些东西'这允许他们搜索日期作为文本和imho有2种可能的解决方案:
如果您(错误地,严重地,差地)将日期信息和格式存储在文本字段中,那么通配符方法将很容易实现,但这会阻止您将任何日期作为日期操作,并会给您带来巨大麻烦在涉及日期处理的第一个请求(按月合并,计算给定时间跨度内的任何费率等)或者您是否恰好在不同国家/地区拥有用户(期望格式与存储在文本中的格式不同)字段)。
在前端实现搜索逻辑,数据库将使用正确的数据类型存储信息,并完成将日期作为文本搜索所需的所有操作。任务由前端执行,前端将为RDBMS提供一组参数,使其能够正确处理日期。
结果如下:
*/12/2015
- > between '20151201' and '20151231'
*/*/2015
- > between '20150101' and '20151231'
*/*/*
- >根本没有过滤器
如果正在使用存储过程,则结果将是几个填充日期值的日期参数。
答案 1 :(得分:1)
我会像你已经建议的那样做并解析搜索字符串。然后,根据搜索字符串,您可以选择数据。但是,您不必创建日期范围,您可以使用YEAR和MONTH。
您的SQL查询可能看起来像这样
SELECT * FROM YourTable WHERE YEAR(YourDate) = 2015 and MONTH(YourDate) = 12
答案 2 :(得分:0)
在SQL中,您可以将*
替换为%
并使用LIKE
。这是一个例子:
SELECT *
FROM (
SELECT cast('20150611' as date) as dateColumn
UNION
SELECT cast('20150610' as date)) as X
WHERE convert(varchar, dateColumn, 103) LIKE N'%/06/2015'
请记住,从性能的角度来看,这是实用的,而不是最佳解决方案。