求助,想在Oracle中调取当天数据或者近几天数据,sql语句出现问题,求解决办法。,现将近几天调试状况写一下,希望

dushen4565551 2012-08-07 04:31:14
从PLC中不间断的会将数据存储如Oracle表格中,现在我用VC6.0做了个程序,需要将这些数据提取出来做一些处理,目前一直调试试图获取当天数据。下面是我的调试情况,有不足之处希望高手指点。
1、获取当前时间,
CTime t;
t=CTime::GetCurrentTime();
CString daystamp;
daystamp.Format("%d-%d-%d",t.GetYear(),t.GetMonth(),t.GetDay());

2、Oracle表中的数据是每分钟一个,表中直到目前每天的数据均存在,现在将表格简化一下,假设表格名字为test,有如下类别: updatetime Date类型; test_date Number类型。
<1>① 我开始的sql语句是这样写的:
SELECT to_char(updatetime,'yyyy-mm-dd') as updatetime, sum(test_date) as test_date FROM 
test where to_char(updatetime,'yyyy-mm-dd')='"+daystamp+"' group by to_char(updatetime,'yyyy-mm-dd')
,这样到该语句就运行不下去了, 将"="更改为">"和"<"均不行。
② 之后,我将代码修改为
SELECT to_char(updatetime,'yyyy-mm-dd') as updatetime, sum(test_date) as test_date FROM test 
where to_char(updatetime,'yyyy-mm-dd')='2012-07-25' group by to_char(updatetime,'yyyy-mm-dd')

可以取得数据,将"="更改为">"和"<"均可以。
<2>① 我想可能是字符进行比较大小可能有问题,我有进行如下改变:
SELECT to_char(updatetime,'yyyy-mm-dd') as updatetime, sum(test_date) as test_date FROM test
where to_date(to_char(updatetime,'yyyy-mm-dd'),'yyyy-mm-dd')=to_date('"+daystamp+"','yyyy-mm-dd') group by to_char(updatetime,'yyyy-mm-dd')

这样也不可以,运行不下去,到这里就崩溃了。
② 但是换为具体时间之后就又可以运行,
SELECT to_char(updatetime,'yyyy-mm-dd') as updatetime, sum(test_date) as test_date FROM test 
where to_date(to_char(updatetime,'yyyy-mm-dd'),'yyyy-mm-dd')=to_date('2012-08-03','yyyy-mm-dd') group by to_char(updatetime,'yyyy-mm-dd')
该处运行正常。
这是不是意味着需要将CString类型的daystamp在进行一下转换,才可以比较大小,我在网上至今没找到有效地方法,现在将这个问题交给坛子里的各位达人,感觉什么地方有问题尽可以提出来,我会虚心接受大家的建议,谢谢!!!
...全文
346 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dushen4565551 2012-08-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
在Oracle数据库中拼接字符串是用||而不是+

SQL code

SELECT to_char(updatetime,'yyyy-mm-dd') as updatetime, sum(test_date) as test_date FROM test
where to_date(to_char(updatetime,'yyyy-mm-dd'),'yyyy-mm-dd')=to_d……
[/Quote]

最近出差,一直没有上网,我按照你的方法试了一下,不知道为什么运行到这一句,还是不行。麻烦问一下还有其他方法没有?
xpingping 2012-08-08
  • 打赏
  • 举报
回复
我提楼主鄙视我下
execute immediate 'SELECT to_char(updatetime,''yyyy-mm-dd'') as updatetime, 
sum(test_date) as test_date
FROM test
where to_char(updatetime,''yyyy-mm-dd'')='||daystamp||'
group by to_char(updatetime,''yyyy-mm-dd'')'

oracle中字符串连接是||不是+
睿智天成 2012-08-08
  • 打赏
  • 举报
回复
在Oracle数据库中拼接字符串是用||而不是+

SELECT to_char(updatetime,'yyyy-mm-dd') as updatetime, sum(test_date) as test_date FROM test
where to_date(to_char(updatetime,'yyyy-mm-dd'),'yyyy-mm-dd')=to_date('"||daystamp||"','yyyy-mm-dd') group by to_char(updatetime,'yyyy-mm-dd')
dushen4565551 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
SQL code
--还是sql语句没写好吧,
--c++里的sql查询字符串
"SELECT to_char(updatetime,'yyyy-mm-dd') as updatetime,
sum(test_date) as test_date
FROM test
where to_char(updatetime,'yyyy-mm-dd')='"+daystamp+"'
……
[/Quote]
''yyyy-mm-dd''这种写法会报错,还是没实现我要的功能。谢谢~~~
xpingping 2012-08-07
  • 打赏
  • 举报
回复
--还是sql语句没写好吧,
--c++里的sql查询字符串
"SELECT to_char(updatetime,'yyyy-mm-dd') as updatetime,
sum(test_date) as test_date
FROM test
where to_char(updatetime,'yyyy-mm-dd')='"+daystamp+"'
group by to_char(updatetime,'yyyy-mm-dd')"
--oracle里的sql ,动态sql
execute immediate 'SELECT to_char(updatetime,''yyyy-mm-dd'') as updatetime,
sum(test_date) as test_date
FROM test
where to_char(updatetime,''yyyy-mm-dd'')='+daystamp+'
group by to_char(updatetime,''yyyy-mm-dd'')'
dushen4565551 2012-08-07
  • 打赏
  • 举报
回复
继续求助,这周就要弄好,其他计算部分都整好了,就差这点了,如果哪位大神有其他的思路也好,多谢!
dushen4565551 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
不是,轉換為2012-03-04 這種格式04-8月-12是我這邊oracle默認顯示時間格式,你要讓oracle可識別你的日期就可以了

SQL code

set serveroutput on;
declare
v_time1 varchar2(20) :='2012-03-04 12:03:04';
v_time2 varchar2(20) :='2012.……
[/Quote]

现在情况是这样的,我直接写具体的日期,没问题可以查询,但是加上CString 的daystamp后就是不行,我感觉也是应该转换一下格式或者进行一下处理,就是现在还没想出来,也是从没遇到过这样的问题。还是非常感谢...
人生无悔 2012-08-07
  • 打赏
  • 举报
回复
不是,轉換為2012-03-04 這種格式04-8月-12是我這邊oracle默認顯示時間格式,你要讓oracle可識別你的日期就可以了

set serveroutput on;
declare
v_time1 varchar2(20) :='2012-03-04 12:03:04';
v_time2 varchar2(20) :='2012.03.05';--你的字符串應像這種或'2012-03-05'或'2012/03/05'都可以的
begin
dbms_output.put_line('v_time1:'||to_date(v_time1,'yyyy-mm-dd'));
exception
when others then
dbms_output.put_line('v_time1:日期格式轉換出錯');
dbms_output.put_line('v_time2:'||to_date(v_time2,'yyyy-mm-dd'));
end;
/
dushen4565551 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
SQL code

--看这个例子你可能就明白了
SQL> set serveroutput on;
SQL> declare
2 v_time1 varchar2(20) :='2012-03-04 12:03:04';
3 v_time2 varchar2(20) :='2012.03.05';
4 begin
5 dbms_ou……
[/Quote]

你好,非常感谢您的回复,按照我对这段代码的理解是将daystamp转换为05-3月 -12 这种格式吗?我尝试了一下,将04-8月-12和04-08-2012,还是没能取得数据,可能是我没准确理解这段代码的含义,麻烦你再详细说一下。
dushen4565551 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
to_date('"+daystamp+"','yyyy-mm-dd')
-----这两个加号问题大了---去掉---
[/Quote]
去掉加号出现如下错误:
error C2146: syntax error : missing ';' before identifier 'daystamp'
ORAClE SE 2012-08-07
  • 打赏
  • 举报
回复
to_date('"+daystamp+"','yyyy-mm-dd')
-----这两个加号问题大了---去掉---
人生无悔 2012-08-07
  • 打赏
  • 举报
回复

--看这个例子你可能就明白了
SQL> set serveroutput on;
SQL> declare
2 v_time1 varchar2(20) :='2012-03-04 12:03:04';
3 v_time2 varchar2(20) :='2012.03.05';
4 begin
5 dbms_output.put_line('v_time1:'||to_date(v_time1,'yyyy-mm-dd'));
6 exception
7 when others then
8 dbms_output.put_line('v_time1:日期格式轉換出錯');
9 dbms_output.put_line('v_time2:'||to_date(v_time2,'yyyy-mm-dd'));
10 end;
11 /
v_time1:日期格式轉換出錯
v_time2:05-3月 -12

已順利完成 PL/SQL 程序.

ORAClE SE 2012-08-07
  • 打赏
  • 举报
回复
to_date('"+daystamp+"','yyyy-mm-dd')
-----这两个加号问题大了---去掉---
人生无悔 2012-08-07
  • 打赏
  • 举报
回复
to_date('"+daystamp+"','yyyy-mm-dd')
这句把你的daystamp转换成后面类似的格式再传入就可以了

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧