锁定老帖子 主题:Oracle 时间段查询
精华帖 (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花这么大劲设计一套跟其他数据库都不同的日期处理机制做什么? |
|
返回顶楼 | |
发表时间: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) ,因为不涉及到国外的时间,这样使用很简便。 |
|
返回顶楼 | |
发表时间: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,确实没遇到过这样的问题。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2011-06-19
wxwdt 写道 select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=?
用trunc函数就可以了 +1 |
|
返回顶楼 | |
发表时间:2011-06-20
tianhandigeng 写道 chansman 写道 你还是应该使用第一种方法,因为第二种方法吧数据库中所有的数据都做了 to_char.
to_date 是 yyyy-mm-dd 不是MM 同时你还应该注意临界时间 把数据库中所有的数据都做了 to_char. 这怎么里面,是数据库中所有的记录都这样处理了? 不要对数据库中的子段做操作. |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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没记录.... |
|
返回顶楼 | |
发表时间: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 最标准的,别的都比较傻。 |
|
返回顶楼 | |
发表时间:2011-06-20
wxwdt 写道 select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=?
用trunc函数就可以了 只能说能实现 |
|
返回顶楼 | |