查询2个日期间的记录,如何才能利用到SQL的索引?

uw301336 2017-09-19 08:10:41
问题:用SQL2000建立的数据表,其中有一个: 派工时间 的smalldatetime类型的字段,需要经常用以下语句查询2个日期之间的记录:

例如:要查询派工时间在2017.09.10 到2017.09.16之间的所有派工记录:
XIN1=开始日期 &&2017.09.10
XIN2=结束日期 &&2017.09.16
SQLEXEC(CON,"SELECT * FROM PGK WHERE CONVERT(VARCHAR(100),派工时间,23) BETWEEN ?XIN1 AND ?XIN2 ")

为此在SQL中建立了:派工时间 字段的索引文件

由于SQL2000没有纯日期型字段,所以要查询2个日期间的记录时必须要用 CONVERT(VARCHAR(100),派工时间,23)函数把派工时间字段转换为不带时间的纯日期型,才能正确返回查询记录。
但好像如果在SQL查询条件中使用函数就不会利用到已建立的索引文件,而是逐条查询,这样按派工时间建立的索引文件就没用了,还浪费了资源。

我想请大师给指点一下,对于SQL的smalldatetime类型的字段,如何才能在2个日期间查询时能利用到已建立的索引文件? 谢谢!
...全文
596 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
uw301336 2017-09-20
  • 打赏
  • 举报
回复
夜猫老师你好,按您的方法执行后,以下这条SQL查询语句未被执行,出错。不知是什么原因? SQLEXEC(CON,"SELECT * FROM PGK WHERE 派工时间 BETWEEN ?XIN1 AND ?XIN2") ------------------------------------------------------------------------------------------------------------------------------- 如果按开始日期:2017.09.15 结果日期:2017.09.16 来查询的话: xin1 = Dtos(开始日期) xin1计算后的结果是:'20170915' xin2 = Ttoc(Dtot(结束日期+1)-1,3) xin2计算后的结果是:'20170916235959' 是否是xin2这个变量的结果值导致查询失败?
都市夜猫 2017-09-20
  • 打赏
  • 举报
回复
引用 2 楼 uw301336 的回复:
xin2 = Ttoc(Dtot(结束日期+1)-1,3)
xin2计算后的结果是:'20170916235959'
是否是xin2这个变量的结果值导致查询失败?


兴许是版本的问题吧,vfp9 用 3 做参数,返回的是标准时间串格式
uw301336 2017-09-20
  • 打赏
  • 举报
回复
经实验,用以下方法可实现: XIN1=STRTRAN(dtoc(thisform.text2.value),'.','-')+' 00:00:00' XIN2=STRTRAN(dtoc(thisform.text3.value),'.','-')+' 23:59:00' SQLEXEC(CON,"SELECT * FROM GYWGK WHERE 派工时间 BETWEEN ?XIN1 AND ?XIN2") 其中:thisform.text2.value 是开始日期 thisform.text3.value 是结束日期
都市夜猫 2017-09-19
  • 打赏
  • 举报
回复
xin1 = Dtos(开始日期)
xin2 = Ttoc(Dtot(结束日期+1)-1,3)
SQLEXEC(CON,"SELECT * FROM PGK WHERE 派工时间 BETWEEN ?XIN1 AND ?XIN2")

2,727

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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