我想根据我的$ 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值,因此使其不是动态的。
我做错了什么?
答案 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