锁定老帖子 主题:Oracle 时间段查询
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-17
最后修改:2011-06-19
需求:根据用户输入的时间段查询出记录。 Oracle数据库中一个一个存放时间的字段,字段类型是DATE型的,其中有这样的两条数据
select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-16','yyyy-MM-dd'); 这样查询的话2011/6/16这条记录是查不出来的,因为字段存了时分秒。 最后通过群里的朋友的指点改成了这样: select * from tb_product where to_char(createdate,'yyyy-MM-dd')>='2011-6-13' and to_char(createdate,'yyyy-MM-dd')<='2011-6-16'; 这样也查不出来,不是语句错了,而是我日期格式错了,日期格式是‘yyyy-MM-dd’这样的,而我写的是2011-6-13,改成 2011-06-13和2011-06-16就可以了。 上面的方法就是只按照日期查询的方法了,各位有更好的方法,请留言。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-06-17
你还是应该使用第一种方法,因为第二种方法吧数据库中所有的数据都做了 to_char.
to_date 是 yyyy-mm-dd 不是MM 同时你还应该注意临界时间 |
|
返回顶楼 | |
发表时间:2011-06-17
chansman 写道 你还是应该使用第一种方法,因为第二种方法吧数据库中所有的数据都做了 to_char. to_date 是 yyyy-mm-dd 不是MM 同时你还应该注意临界时间 把数据库中所有的数据都做了 to_char. 这怎么里面,是数据库中所有的记录都这样处理了? |
|
返回顶楼 | |
发表时间:2011-06-17
to_char那岂不是把查询的时间字段转换为字符来进行比较大小,那还有何意义呢?那还不干脆在设计库的时候就把时间字段设置为字符型的,只是觉得违反约束了.
|
|
返回顶楼 | |
发表时间:2011-06-17
select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=?
用trunc函数就可以了 |
|
返回顶楼 | |
发表时间:2011-06-17
不要把函数用在表字段上,这种方式无法利用索引,必然产生全表扫描。除非建立函数索引。
建议在进入SQL查询前,先对参数进行一些处理。在to_date前,在参数后面加上分钟比较合适。 |
|
返回顶楼 | |
发表时间:2011-06-17
createdate是索引字段的话,第二个SQL丢失索引
也不知识谁指导LZ的 |
|
返回顶楼 | |
发表时间:2011-06-18
最后修改:2011-06-18
select * from tb_product where
createdate > to_date('2011-6-15','yyyy-MM-dd') - 1 and createdate<=to_date('2011-6-16','yyyy-MM-dd') + 1; 上面写有问题: 好像是应该是 >= aaa and < bbb - 1 |
|
返回顶楼 | |
发表时间:2011-06-18
createdate < to_date('2011-6-16','yyyy-MM-dd') + 1;
|
|
返回顶楼 | |
发表时间:2011-06-18
wad12302 写道 select * from tb_product where
createdate > to_date('2011-6-15','yyyy-MM-dd') - 1 and createdate<=to_date('2011-6-16','yyyy-MM-dd') + 1; 个人认为这种方式好一些 |
|
返回顶楼 | |