+ -
当前位置:首页 → 问答吧 → ORACLE 查询当天信息数问题

ORACLE 查询当天信息数问题

时间:2011-11-02

来源:互联网

本来觉得这问题不难,可是调了半天,总是在报错:
表里有个时间字段,格式:2010-11-02 00:38:23,varchar2类型的。想写个sql查询下2010-11-02这天或是某一天的信息数,一直报错,invalid number。网上看了别人也是这么写的,都说没问题。
select * from t_acsrecord where to_char(accesstime,'yyyy-mm-dd') = to_char(sysdate,'yyyy-mm-dd')
(ORA-01722:invalid number)
select * from t_acsrecord where trunc(accesstime) = trunc(sysdate)
(ORA-00932:inconsistent datatypes:expected NUMBER got DATE)

应该是类型不匹配吧,哪位高人支支招啊

作者: yiyuanhong   发布时间: 2011-11-02

accesstime 字段是什么类型的? date ?

作者: opps_zhou   发布时间: 2011-11-02

引用 1 楼 opps_zhou 的回复:
accesstime 字段是什么类型的? date ?

varchar2的

作者: yiyuanhong   发布时间: 2011-11-02

引用 1 楼 opps_zhou 的回复:
accesstime 字段是什么类型的? date ?

varchar2的

作者: yiyuanhong   发布时间: 2011-11-02

可以这样:
SQL code

select * from t_acsrecord 
where 
to_date(accesstime,'yyyy-mm-dd hh24:mi:ss') = 
to_date(sysdate,'yyyy-mm-dd hh24:mi:ss')


或者这样:
SQL code

select * from t_acsrecord
where
trunc(to_date(accesstime,'yyyy-mm-dd hh24:mi:ss')) = trunc(sysdate)


作者: wangliangffaflgh   发布时间: 2011-11-02

where trunc(sysdate,'dd')=to_date(accesstime,'yyyy-mm-dd')

作者: funfenffun   发布时间: 2011-11-02

引用 4 楼 wangliangffaflgh 的回复:
可以这样:

SQL code


select * from t_acsrecord
where
to_date(accesstime,'yyyy-mm-dd hh24:mi:ss') =
to_date(sysdate,'yyyy-mm-dd hh24:mi:ss')


或者这样:

SQL code


select * from t_acsrecor……

还是有错。。。ORA-01861:literal does not match format string

作者: yiyuanhong   发布时间: 2011-11-02

select * from t_acsrecord 
where 
trunc(to_date(accesstime,'yyyy-mm-dd hh24:mi:ss'),'dd') = 
trunc(sysdate,'dd')

作者: zxf261   发布时间: 2011-11-02

varchar2 类型,就不需要 to_char(accesstime) 了,直接 accesstime = to_char(sysdate,'yyyy-mm-dd')
引用 2 楼 yiyuanhong 的回复:

引用 1 楼 opps_zhou 的回复:
accesstime 字段是什么类型的? date ?

varchar2的

作者: opps_zhou   发布时间: 2011-11-02

引用 8 楼 opps_zhou 的回复:
varchar2 类型,就不需要 to_char(accesstime) 了,直接 accesstime = to_char(sysdate,'yyyy-mm-dd')

引用 2 楼 yiyuanhong 的回复:

引用 1 楼 opps_zhou 的回复:
accesstime 字段是什么类型的? date ?

varchar2的

恩,确实是,但是accesstime还是要截取过的,不然取不到数据了

作者: yiyuanhong   发布时间: 2011-11-02

引用 7 楼 zxf261 的回复:
select * from t_acsrecord
where
trunc(to_date(accesstime,'yyyy-mm-dd hh24:mi:ss'),'dd') =
trunc(sysdate,'dd')

我这个还不行?

作者: zxf261   发布时间: 2011-11-02

引用 10 楼 zxf261 的回复:
引用 7 楼 zxf261 的回复:
select * from t_acsrecord
where
trunc(to_date(accesstime,'yyyy-mm-dd hh24:mi:ss'),'dd') =
trunc(sysdate,'dd')

我这个还不行?

当试了,可以的。很感谢,可是想问一下,还有没有简单一点的办法,这样转来专去,效率会不会很低啊?
我也是个菜鸟,还需要好好多学点啊

作者: yiyuanhong   发布时间: 2011-11-02

lz说的对,效率很重要.
如果accesstime列上建了索引的话使用函数会使索引失效.所以可以使用下面的方式查询
SQL code
SELECT *
  FROM t_acsrecord
 WHERE accesstime >= TO_CHAR (TRUNC (SYSDATE), 'yyyy-mm-dd hh24:mi:ss')
   AND accesstime < TO_CHAR (TRUNC (SYSDATE + 1), 'yyyy-mm-dd hh24:mi:ss')

作者: tx2730   发布时间: 2011-11-02

引用 12 楼 tx2730 的回复:
lz说的对,效率很重要.
如果accesstime列上建了索引的话使用函数会使索引失效.所以可以使用下面的方式查询

SQL code

SELECT *
FROM t_acsrecord
WHERE accesstime >= TO_CHAR (TRUNC (SYSDATE), 'yyyy-mm-dd hh24:mi:ss')
AND accesstime < TO_……

恩,其实还要做一个整张表数量的查询,数据量打的话count(*)好像效率很低,网上有说建位图索引,看来要用您的方法试试看了

作者: yiyuanhong   发布时间: 2011-11-02

位图索引是列的值区分度很小的时候才使用的,如员工表有十万条记录,其中省份列是记录员工省份的,中国的省份一共也才30多个,这样区分度小的列比较适合建位图索引.

作者: tx2730   发布时间: 2011-11-02

引用 14 楼 tx2730 的回复:
位图索引是列的值区分度很小的时候才使用的,如员工表有十万条记录,其中省份列是记录员工省份的,中国的省份一共也才30多个,这样区分度小的列比较适合建位图索引.

这个。。。专业了,那弱弱的问一下,如我所说的情况,要计算一张中的记录总数,不考虑别的因素,百万级的数据,用什么方式比较合理?

作者: yiyuanhong   发布时间: 2011-11-02

引用 12 楼 tx2730 的回复:
lz说的对,效率很重要.
如果accesstime列上建了索引的话使用函数会使索引失效.所以可以使用下面的方式查询

SQL code

SELECT *
FROM t_acsrecord
WHERE accesstime >= TO_CHAR (TRUNC (SYSDATE), 'yyyy-mm-dd hh24:mi:ss')
AND accesstime < TO_……

额,发现个奇怪的问题,在PLSQL工具里面测试了下,语句没问题。不过放在eclipse IDE下时,那个小于号竟然报错了,大于等于倒是没问题

作者: yiyuanhong   发布时间: 2011-11-02

引用 16 楼 yiyuanhong 的回复:
引用 12 楼 tx2730 的回复:
lz说的对,效率很重要.
如果accesstime列上建了索引的话使用函数会使索引失效.所以可以使用下面的方式查询

SQL code

SELECT *
FROM t_acsrecord
WHERE accesstime >= TO_CHAR (TRUNC (SYSDATE), 'yyyy-mm-dd hh24:mi:ss')
AND a……

不关sql语句的是,是ibatis的问题,我是小白,大大们莫怪啊

作者: yiyuanhong   发布时间: 2011-11-02