查询数据库有没有某一个日期的值,sql怎么写效率高? 5C

有一个挺大的表,有一个日期时间型字段,我想查是否有某一天的数据,我的sql是这样的:
select COUNT(*) from WenJin where CONVERT(varchar(100), time, 112)='20180418'

最后看count的值是否大于0,如果大于0就说明这个日期有值。
但是感觉这样效率很低,因为要查到那一天的所有数据,然后再count一下。
有没有什么办法,只要找到第一条符合条件的数据,就不再继续往下找了?或者其他效率更高的办法?
sqlserver数据库和oracle数据都要用。

13个回答

提供思路,仅供参考:
1 . 对time字段创建索引;
2. 切记:在大表中不可对列使用函数,否则将扫描全表;
3. 查询条件可使用between,如:where time between '2018-04-18 00:00:00' and '2018-04-18 23:59:59'

可以把时间的数据类型储存为 INT 为时间戳 然后在建立索引 这样查的就快了

sql有内建日期函数,度娘一下,可以基本满足你的要求。

先对日期字段进行排序

再执行sql select top 1 * from where time>='2018-04-18' AND time<'2018-04-19'

Tjook
Tjook 大小于会存在转换问题吗,这样速度也可以吧
一年多之前 回复

可以建表的索引 ,这样查询效率高

你写sql的时候, select * from WenJin where CONVERT(varchar(100), time, 112)='20180418' limit 1 如果是mysql的话, 则只能查询出来一条数据,
在程序中进行判断是否为空, 如果不为空,则存在,如果为空,则不存在, 这样效率会高。

加索引,也不要在索引字段上使用函数。

你这个查询可以看一下执行计划,确认一下是否有用到索引,一般来说,如果建的是普通索引,那么你上面的查询不会用到索引,所以查询肯定会慢。
如果建的是函数索引,并且用到的函数也是CONVERT,这样子你这个查询才会用到索引,我估计要么就是你没有用到索引导致查询慢,要么就是你的表太大了,即使用到索引,确实要花费一点时间。
另外还有一个折衷的方法满足你的要求.如果你只想确认某一天是否有数据,还可以这样子查
select * from WenJin where CONVERT(varchar(100), time, 112)='20180418' and rownum=1;
当然最好把*号变成 具体某一列也会加快查询

用CONVERT(varchar(100), time, 112) 这样肯定消耗效率的,可以考虑 time between '2018121800000' and '2018122300000' 大概这样。嗯

1、如果是普通索引,建议等号左边的字段不要用函数转换,可以把右边的值进行转换
2、你的问题是判断日期有没有值,不需要把所有的都查出来

共13条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!