C# 完成“以文本形式搜索日期”任务所需的操作由前端执行,前端将向RDBMS提供一组参数,使其能够正确处理日期

C# 完成“以文本形式搜索日期”任务所需的操作由前端执行,前端将向RDBMS提供一组参数,使其能够正确处理日期,c#,sql-server,C#,Sql Server,结果如下: */12/2015-->“20151201”和“20151231”之间的 */*/2015-->介于“20150101”和“20151231”之间的 */*/*-->根本没有过滤器 如果使用存储过程,结果将是两个日期参数,其中填充了日期值。您找到的解决方案是在正确处理信息时唯一有意义的解决方案 你所要求的是给用户“一些东西”,允许他们以文本形式搜索日期,我想有两种可能的解决方案: 你找到的那一个(我是“正确的”那一个) 将日期存储为格式化字符串(错误、避免、噩梦) 如果您(错误地

结果如下:
*/12/2015
-->“20151201”和“20151231”之间的

*/*/2015
-->介于“20150101”和“20151231”之间的

*/*/*
-->根本没有过滤器


如果使用存储过程,结果将是两个日期参数,其中填充了日期值。

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

你所要求的是给用户“一些东西”,允许他们以文本形式搜索日期,我想有两种可能的解决方案:

  • 你找到的那一个(我是“正确的”那一个)
  • 将日期存储为格式化字符串(错误、避免、噩梦)
如果您(错误地、糟糕地、糟糕地)将日期信息和格式存储在文本字段中,那么通配符方法将很容易实现,但这将阻止您将任何日期作为日期进行操作,并且在涉及日期处理的第一个请求中会给您带来巨大的麻烦(按月合并,计算给定时间范围内的任何费率,等等),或者如果您碰巧有来自不同国家/地区的用户(这些国家/地区的用户期望的格式与存储在文本字段中的格式不同)

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

结果如下:
*/12/2015
-->“20151201”和“20151231”之间的

*/*/2015
-->介于“20150101”和“20151231”之间的

*/*/*
-->根本没有过滤器


如果使用存储过程,则结果将是两个日期参数,其中填充了日期值。

在SQL中,您可以将
*
替换为
%
,并像
一样使用
。下面是一个示例:

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'

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

在SQL中,您可以将
*
替换为
%
,并像
一样使用
。以下是一个示例:

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'

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

在SQL中,您可以将
*
替换为
%
,并像
一样使用
。以下是一个示例:

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'

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

在SQL中,您可以将
*
替换为
%
,并像
一样使用
。以下是一个示例:

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'

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

“一种更简单的方法”并不是一个真正的问题。您具体需要帮助的部分是什么?请看一看。在给定的情况下,我将解析日期搜索字符串,以获取整数形式的日期、月份和年份(在c#中),然后在sql中按3个整数参数进行搜索(我假设日期列的类型是datetime,而不是varchar)似乎使用范围解析和搜索是一个很好的解决方案。如果您在日期字段上有索引,那么范围条件将使用它。如果您开始强制转换,可能会出现性能问题。顺便问一下,在数据库中使用什么数据类型来存储日期?表中是否有许多行?出于好奇,是否会出现
*/12/*
(任何一年的12月)也可以吗?否则我会将解析的值转换为范围,并使用
介于
之间以获得更好的性能(取决于您的索引)。使用year()和month()可能会将您的查询计划更改为索引扫描,而不是搜索。抱歉@kiryl,交叉发布“更简单的方法”这不是一个真正的问题。您具体需要帮助的部分是什么?请看一看。在给定的情况下,我将解析日期搜索字符串,将日期、月份和年份作为整数(在c#中),然后在sql中按3个整数参数进行搜索(我假设日期列的类型是datetime,而不是varchar)似乎使用范围解析和搜索是一个很好的解决方案。如果您在日期字段上有索引,那么范围条件将使用它。如果您开始强制转换,可能会出现性能问题。顺便问一下,在数据库中使用什么数据类型来存储日期?表中是否有许多行?出于好奇,是否会出现
*/12/*
(任何一年的12月)也可以吗?否则我会将解析的值转换为范围,并使用
介于
之间以获得更好的性能(取决于您的索引)。使用year()和month()可能会将您的查询计划更改为索引扫描,而不是搜索。抱歉@kiryl,交叉发布“更简单的方法”这不是一个真正的问题。您具体需要帮助的部分是什么?请看一看。在给定的情况下,我将解析日期搜索字符串,将日期、月份和年份作为整数(在c#中),然后在sql中按3个整数参数进行搜索(我假设日期列的类型是datetime,而不是varchar)似乎使用范围解析和搜索是一个很好的解决方案。如果您在日期字段上有索引,那么范围条件将使用它。如果您开始强制转换,可能会出现性能问题。顺便问一下,在数据库中使用什么数据类型来存储日期?表中是否有许多行?出于好奇,是否会出现
*/12/*
(任何一年的12月)也可以吗?否则我会将解析的值转换为范围,并使用
介于
之间以获得更好的性能(取决于您的索引)。使用year()和month()可能会将您的查询计划更改为索引扫描,而不是搜索。抱歉@kiryl,交叉发布“更简单的方法”这不是一个真正的问题。您具体需要帮助的部分是什么?请看一看。在给定的情况下,我将解析日期搜索字符串,将日期、月份和年份作为整数(在c#中),然后在sql中按3个整数参数进行搜索(i