关于动态查询中的字符串匹配问题

fangweng1937 2003-08-26 02:28:48
本人在做时间查询时使用sql中的字符串部分匹配符号%,相关代码如下:
Query1.SQL.Add(' where 时间 LIKE "(:time)%" ');
Query1.ParamByName('time').asdatetime:= strtodatetime(Edit1.text);
可是由于(:time)%两边的引号,编译时找不到time参数了.
将引号去掉可以传入参数,可是不符合sql语法了.
不知哪位能出个高招,解决下.不胜感激!
...全文
40 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sy_315 2003-08-27
  • 打赏
  • 举报
回复
Query1.SQL.Add(' where 时间 LIKE '+:time+'+% ');

guanghui 2003-08-27
  • 打赏
  • 举报
回复
举一例:
如你要查询日期为"2003-08-05"的记录的时候
定义三个字串变量假设为Nian、Yue、Ri,分别对应年、月、日(也可以为一个,慢慢加起来)
分解该日期到这三个变量中
而根据SQL Server自动转换后的格式(我的是中文版,也许其他版的会有所不同)
可以知道,我们需要将日期按“月%日%年%”的样式拼凑起来就OK了,
拼凑就是
Nian:=Yue+'%'+Ri+'%'+Nian+'%';
按理,这时能找出符合我们要求的记录了,但真的如此吗?
留意一下“日”部分,我们可以发现单个数的时候,SQL Server将不自动给他分配0在前面
而如果我们统一这样查询,那"2003-08-15"的记录(如果存在的话)也会被查询出来。
这个问题,其实也可以解决,留意一下,实际上转换后的日期的长度是一样的,
月两位,日两位,月与日之间一位空格,只要我们在中间不加通配符,直接加空格,且判断转换后的
“日”的位数,不够两位自动补空格,就OK

当然,这是我的笨方法,我建议不这么用,我更喜欢用between BeginDate and EndDate
fangweng1937 2003-08-26
  • 打赏
  • 举报
回复
“拼凑好字符串的样式”?问题就出在这里,不知道怎么拼凑啊
guanghui 2003-08-26
  • 打赏
  • 举报
回复
就算不报错又怎么样呢,当你使用LIKE=’YYYY-MM-DD%’去执行的时候,SQL SERVER将把表中的日期类型转成字符串看了,于是,本来是‘2003-08-05 00:00:00.000’,转换以后变成’08 5 2003 12:00AM’,你的LIKE还能起作用吗?(能当然能,但你还得告诉用户按转换后的格式输入)
其实,对于日期常用的就是“BETWEEN BDATE AND EDATE”,直接用DATETIMEPICKER控件;如果你确实想方便客户(他想模糊查询),那就建议你在程序中去拼凑好字符串的样式,再去LIKE
fangweng1937 2003-08-26
  • 打赏
  • 举报
回复
还是不行啊,我的时间类型是datetime的,和string类型的总是不匹配的.
看来只有把时间类型改成string了……
answermyquestion 2003-08-26
  • 打赏
  • 举报
回复
说掉了,在楼上 foreveryday007(有無數種方法可以浪費一天的時間…但是…)兄弟

的基础上变为以下试试。

Query1.ParamByName('time').Asstring:= '''' + Edit1.text + '%' + '''';
answermyquestion 2003-08-26
  • 打赏
  • 举报
回复
如果在数据库中如:MS SQLSERVER有一个表的一个字段为日期型,你用以下语句插入
insert into TableName(DateFieldName) values(1981-02-34)将出错
而这样的话就可以了,所以你知道该怎么对待日期型了吧!
insert into TableName(DateFieldName) values('1981-02-34')
fangweng1937 2003-08-26
  • 打赏
  • 举报
回复
时间是datetime类型啊,楼上说的几种好象都不大行.参数是编译完所有语句再加的,所以把语句拆开写好象没什么用.楼上的方法倒能输入参数,就是类型不匹配了.
foreveryday007 2003-08-26
  • 打赏
  • 举报
回复
Query1.SQL.Add(' where 时间 like :time ');

//时间是什么类型?STRING吗?
Query1.ParamByName('time').Asstring:= Edit1.text + '%';

Shiyl 2003-08-26
  • 打赏
  • 举报
回复
这么写 Query1.SQL.Add(' where 时间 LIKE '''+(:time)+‘%’+'''');
Query1.ParamByName('time').asdatetime:= strtodatetime(Edit1.text);
试试
fangweng1937 2003-08-26
  • 打赏
  • 举报
回复
lihao_ningxia(耗子):
 能不能讲具体点?不是太明白那句代码加在哪里呢?
frogshero(光棍菜):
你的方法好象不行啊,他还是说%的使用不合法.
有劳二位了!
frogshero 2003-08-26
  • 打赏
  • 举报
回复
去掉引號:
Query1.ParamByName('time').asstring:= datetimetostr(Date);
上海老李 2003-08-26
  • 打赏
  • 举报
回复
呵呵,可以这样啊:
query1.sql.add(' );
这样就会象 where 时间 LIKE '+2003-08-26%'

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧