论坛首页 Java企业应用论坛

Oracle 时间段查询

浏览 16936 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (3)
作者 正文
   发表时间:2011-06-18   最后修改:2011-06-18
在时间戳这种字段一般都会带有索引,任何函数转换 如TO_CHAR,TRUNC,都会使索引失效,查询速度影响巨大,除非冒更大的风险将索引建在函数基础上。
ORACLE中日期是以7位长的数值储存的,如果我没记错,应该是针对1970年的一个偏移量,
故2011/6/17的偏移量,一定大于2011/6/16 23:59:59秒
所以查不出,不可能是数据库设计问题,只能是使用问题。
仔细想想也知道,如果日期查询还要用字符串做比较,那oracle花这么大劲设计一套跟其他数据库都不同的日期处理机制做什么?
0 请登录后投票
   发表时间:2011-06-18  
select * from tb_product where createdate>=to_date('2011-06-13','yyyy-MM-dd') and createdate<=to_date('2011-06-17','yyyy-MM-dd');  
这样可以查询出来,楼主怎么就查不出来?

另外数据库时间格式也可用字符串格式varchar2(14)  (YYYYMMDDHH24MISS) ,因为不涉及到国外的时间,这样使用很简便。
0 请登录后投票
   发表时间:2011-06-18  
tfwin2 写道
yongqi 写道
我不明白
select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-17','yyyy-MM-dd'); 


这样的写法2011/6/16这条记录为什么查不出来,我一直是这样用的,没发现这个问题?谁讲一下?




这么用是没问题的,估计楼主的代码或语句有问题,oracle的时间段,是可以这样查的,
经严格测试,至少9I,10G两个版本,这么查没有问题,2011/6/16是可以查出来得,依据楼主对数据库知识的匮乏度,只能推测,代码出错。。。。


我用的是10g,确实没遇到过这样的问题。
0 请登录后投票
   发表时间:2011-06-19  
yongqi 写道
我不明白
select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-17','yyyy-MM-dd'); 


这样的写法2011/6/16这条记录为什么查不出来,我一直是这样用的,没发现这个问题?谁讲一下?

写错了 是2011-6-16
0 请登录后投票
   发表时间:2011-06-19  
wxwdt 写道
select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=?
用trunc函数就可以了



+1
0 请登录后投票
   发表时间:2011-06-20  
tianhandigeng 写道
chansman 写道
你还是应该使用第一种方法,因为第二种方法吧数据库中所有的数据都做了 to_char.
to_date 是 yyyy-mm-dd 不是MM 同时你还应该注意临界时间

把数据库中所有的数据都做了 to_char. 这怎么里面,是数据库中所有的记录都这样处理了?


不要对数据库中的子段做操作.
0 请登录后投票
   发表时间:2011-06-20  
richard_2010 写道
wxwdt 写道
select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=?
用trunc函数就可以了



+1


select * from tb_product where createdate>=to_date('2011-06-13','yyyy-MM-dd') and createdate<=to_date('2011-06-16','yyyy-MM-dd'); 
注意临界时间2011-06-16指得是2011-06-16 00:00:00
0 请登录后投票
   发表时间:2011-06-20  
nakupanda 写道
yongqi 写道
我不明白
select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-17','yyyy-MM-dd'); 


这样的写法2011/6/16这条记录为什么查不出来,我一直是这样用的,没发现这个问题?谁讲一下?



不明白TOO



2011/6/16没记录....
0 请登录后投票
   发表时间:2011-06-20  
nirvana1988 写道
fengyexjtu 写道
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;


个人认为这种方式好一些

+1

最标准的,别的都比较傻。
0 请登录后投票
   发表时间:2011-06-20  
wxwdt 写道
select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=?
用trunc函数就可以了

只能说能实现
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics