ORACLE 的PL/SQL语言高手请进!!!(100分)

  • 主题发起人 主题发起人 seucag
  • 开始时间 开始时间
S

seucag

Unregistered / Unconfirmed
GUEST, unregistred user!
oracle数据库中SQL语言中的时间和DELPHI控件的时间匹配问题
我想做一个日累计,

select * from 表名 WHERE jlsj= to_date('2001-11-1','yyyy-mm-dd')
返回 164条记录 但只有年月日严格为'2001-11-1'的记录

select * from 表名 WHERE
to_date(to_char(jlsj,'yyyy-mm-dd'),'yyyy-mm-dd')= to_date('2001-11-1','yyyy-mm-dd')
返回 2024条记录 所有日期格式中 年月日为'2001-11-1'的记录全部找到 3.725秒

select * from 表名 WHERE
to_char(jlsj,'yyyy-mm-dd')='2001-11-01' 2.895秒
返回结果同上

使用to_date(to_char(jlsj...函数以后执行效率很慢,而直接匹配时间又不能找到所有符合条件的记录
哪位高人指点一下,很急,谢谢了,分嫌少可以再加~

 
老大啊,要搞清楚一点,oracle中的datatime是有date和time的,你当然是要用函数来
把这些date和time分开,只查date部分。其实如果只用date的话,你还不如用个char型来
表示这个date呢,这样的话查询的时候就不用这么多函数了。
 
你应该用To_Char要好一些,另外,你也可以用jlsj Like to_date('2001-11-1','yyyy-mm-dd')
也要好一些.因为DATE字段中有DATE和TIME,所以你要只查天数而不是到秒数的话,你最好用
TO_CHAR或LIKE.我一般都是用的LIKE.
 
但我需要精确到 时 就的
分和秒都是0的~

下面还需要根据 月,年来进行统计的

直接用CHAR类型可以解决吗?
还有用'YYYY-MM-DD'格式化日期的时候
如果月或日小于10的话
比如 1 是不是需要表示成'01'?
谢谢二位的回答
 
那得看你用什么格式了.
to_char('yyyy-mm-dd hh24:mi:ss',youfield)//表示'2001-11-05 16:25:09'类似的.
select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;//这就是一个字符型了
你最好用这种格式的,因为没有例外,小于10的就会在前面加个0,你不用去考虑什么小于9多于
9的问题.
你要精确要小时就如下来.
select to_char(sysdate,'yyyy-mm-d hh24') from dual;
 
其实像这种你查询时不用到什么time之类的,还是用char型还方便点,只不过是保存的时候
要做个转换。
 
WHERE jlsj between = to_date('2001-11-1 00:00:01','yyyy-mm-dd hh:nn:ss') and to_date('2001-11-1 23:59:59','yyyy-mm-dd hh:nn:ss')
 
谢谢zhangkan
使用to_char的话是可以解决问题
但是在DELPHI中转化DateTimePicker1的DATETIME为字符串的时候好象存在01的问题的

另外就是使用to_char会有多大的影响?
 
用To_Char没有什么影响.就跟TO_DATE一样,但比TO_DATE方便一些.
另外,你用FormatDateTime只要你的格式指定正确,就不会存在01问题.照下面的来.
var str:string;
begin
str:=FormatDateTime('yyyy-mm-dd hh:mm:ss',DateTimePicker1.DateTime);
showmessage(str);
end;
 
谢谢zhangkan
比我原来的方式好多了
速度还是有点慢,比直接用JLSJ=慢多了

谢谢各位~
 
后退
顶部