DATETIME与LIKE进行动态搜索SQL

时间:2016-05-13 12:05:25

标签: mysql sql sql-server-2008

我想根据我的$ data输入在我的数据库中动态搜索日期。

日期存储为日期时间,通常显示为ex:“2016-05-11”。

使用MySql DB我的子句是:

Select * From Table WHERE ( Table.date LIKE '$data%' ) 

因此,如果用户输入“20”,则结果将是以20开头的所有日期。如果用户输入“2016-05”,则结果将是从2016-05开始的所有日期,使我的搜索完全正常。

在Sql Server 2008上部署时,我实现了两件事。

1)如果我使用LIKE函数作为这样的

Select * From Table WHERE ( Table.date LIKE '%$data$%') 

该函数将用于值“2016”,但在输入值“2016-”时将返回0结果。

2)如果我使用DATETIME这样的功能

Select * From Table WHERE ( DATEPART(year, Table.date) LIKE(OR)= '$data') 

当$ data = 2016时,该函数将返回正确的值,但是当$ data ='201'时将返回nil值,因此使其不是动态的。

我做错了什么?

3 个答案:

答案 0 :(得分:0)

隐式转换只是坏的,坏的,坏的 - 在SQL或大多数其他编程语言中。

LIKE对字符串起作用。如果您希望它在字符串上工作,那么显式确保参数是字符串。这在MySQL和SQL Server中都是如此。

如果您想在年份中使用LIKE,请使用DATENAME()而不是DATEPART()

WHERE DATENAME(year, Table.date) LIKE '$data'

但是,我建议您考虑使用基于日期的结构的日期,例如日期范围。

答案 1 :(得分:0)

我刚刚意识到我的愚蠢错误。 我需要使用DATEPART为我的LIKE子句添加一个通配符。

选择*来自表格WHERE(DATEPART(年,表日期)LIKE =' $ data%')。

完美无缺。

但我希望其他建议可以简化将$数据拆分为YYYY,MM,DD然后测试每个元素。

答案 2 :(得分:0)

我会努力让Table.date不受操纵,因此使用索引。

相反,您可以使用CASE表达式通过添加缺少的部分将搜索参数转换为日期范围:

下限:

CASE LENGTH($data) 
 WHEN 8 THEN $data + '01'
 WHEN 7 THEN $data + '-01'
 WHEN 5 THEN $data + '01-01'
 WHEN 4 THEN $data + '-01-01'
 ELSE $data
END

上限:

CASE LENGTH($data) 
 WHEN 8 THEN DATEADD(MONTH,$data + '01',1)
 WHEN 7 THEN DATEADD(MONTH,$data + '-01',1)
 WHEN 5 THEN DATEADD(YEAR,$data + '01-01')
 WHEN 4 THEN DATEADD(YEAR,$data + '-01-01')
 ELSE DATEADD(DAY,$data,1)
END