如何使用通配符搜索日期字段?

时间:2015-06-10 08:03:41

标签: c# sql-server

我的ASP.Net应用程序中有一个日期搜索字段,用户输入他要查找的日期,SQL查询查找提供的确切日期。

我被要求允许用户使用通配符输入日期搜索,如下所示:
- */12/2015将意味着2015年12月的所有月份 - */*/2015意味着2015年全年 - */*/*意味着获得所有数据

我能想到的唯一方法是在日期中查看我的C#代码中的'*',如果它存在,我会根据{{1}的位置将日期范围替换为查询}。

这个解决方案对我来说看起来不实用,在C#或SQL中有更简单的方法吗?

3 个答案:

答案 0 :(得分:2)

您找到的解决方案是正确处理信息时唯一有意义的解决方案。

你被要求的是给用户一些东西'这允许他们搜索日期作为文本和imho有2种可能的解决方案:

  • 你找到的那个(imho the#39; right' one)
  • 将日期存储为格式化字符串(BAD,AVOID,NIGHTMARE)

如果您(错误地,严重地,差地)将日期信息和格式存储在文本字段中,那么通配符方法将很容易实现,但这会阻止您将任何日期作为日期操作,并会给您带来巨大麻烦在涉及日期处理的第一个请求(按月合并,计算给定时间跨度内的任何费率等)或者您是否恰好在不同国家/地区拥有用户(期望格式与存储在文本中的格式不同)字段)。

在前端实现搜索逻辑,数据库将使用正确的数据类型存储信息,并完成将日期作为文本搜索所需的所有操作。任务由前端执行,前端将为RDBMS提供一组参数,使其能够正确处理日期。

结果如下:
*/12/2015 - > between '20151201' and '20151231'
*/*/2015 - > between '20150101' and '20151231'
*/*/* - >根本没有过滤器

如果正在使用存储过程,则结果将是几个填充日期值的日期参数。

答案 1 :(得分:1)

我会像你已经建议的那样做并解析搜索字符串。然后,根据搜索字符串,您可以选择数据。但是,您不必创建日期范围,您可以使用YEARMONTH

您的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'

请记住,从性能的角度来看,这是实用的,而不是最佳解决方案。