oracle中两个varchar2类型的时间怎么进行比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中两个varchar2类型的时间怎么进行比较相关的知识,希望对你有一定的参考价值。

我表里面有两个时间in_date和out_date两个字段的类型都是varchar2的表名car_goods_info时间类型为年-月-日 时:分:秒。null表示今天我要获取到7点到8点,8点到9点之间的数据,请问能办到么?不管是in_date还是out_date都可以同列字段之间的时间。

需要转换成date格式进行比较,或者直接比较也可以。

比如时间格式是2104-01-01 00:00:00。

语法:

select sign(to_date(\'2015-01-01 00:00:00\', \'yyyy-mm-dd hh24:mi:ss\') -
            to_date(\'2015-01-02 00:00:00\', \'yyyy-mm-dd hh24:mi:ss\'))
  from dual

如果返回值为-1,则前边的日期较小;返回值为0,则两个值一样大;返回值为1,则后边的日期较小。

参考技术A 可以将字符串转换为日期类型(TO_DATE方法)进行比较。
sql: SELECT TO_DATE('2006-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS')-TO_DATE('20015-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;

备注:时间做差的话,越是靠近当前时间的日期越大,所以大于0就是前面的时间大,否则就是后面的时间大。
参考技术B 可以办到的.有两个函数你会用的到to_char,to_date()追问

能给我写个伪SQL语句么?我之前在网上看了一下

参考技术C oracle里不是有date类型嘛,我不明白为什么你的两个日期是varchar2型的。

select * from car_goods_info
where to_date(in_date,'yyyy-MM-dd hh24-mm-ss') between to_date('2014-10-23 07:00:00','yyyy-MM-dd hh24-mm-ss') and to_date('2014-10-23 08:00:00','yyyy-MM-dd hh24-mm-ss')
and to_date(out_date,'yyyy-MM-dd hh24-mm-ss') between to_date('2014-10-23 08:00:00','yyyy-MM-dd hh24-mm-ss') and to_date('2014-10-23 09:00:00','yyyy-MM-dd hh24-mm-ss');
oracle 里 DATE型是可以比较的 所以我都给你转成了DATE型 看着舒坦多了。追问

如果我要把一天24小时的记录全部按一个小时一个小时来展示比如7到8点8到9点是不是要将这种查询语句写成select (上述sql语句区间改为7-8)
) as 7到8(sql区间改为8-9) as 8到9,.... from car_goods_info这样么?有简便的方法没

追答

1-2 2-3 3-4 4-5。。。。。。

v1 v2 v3 v4 。。。。。。
你要这样的显示结果是吗?如果你的car_goods_info只有一列是可以的,但是多余一列是不行的。
比如in_date和out _date不能as成一个7-8。
如果你真的只有一列,非要这样显示的话,要显示几个区间,就要在SELECT后面接几个字段。

本回答被提问者采纳
参考技术D to_date: select to_date('2014-10-23 12:30:59','yyyy-MM-dd hh24:mi:ss') d1 from dual;

类似下面的:
select * from car_goods_info where to_date(in_date ,'yyyy-MM-dd hh24:mi:ss') between to_date('2014-10-23 08:00:00','yyyy-MM-dd hh24:mi:ss') and ('2014-10-23 09:00:00','yyyy-MM-dd hh24:mi:ss')追问

  如果我要把一天24小时的记录全部按一个小时一个小时来展示比如7到8点8到9点是不是要将这种查询语句写成select (上述sql语句区间改为7-8)
) as 7到8(sql区间改为8-9) as 8到9,.... from car_goods_info这样么?

怎么解决ORACLE 中 CHAR类型的索引问题

在很多场景中,都有如下情况

trim(a.colunm1) = trim(b.colunm2)

应该怎么优化呢?

用到 TRIM 的很多原因是某些系统为了提高查询效率,不使用  ORACLE 的特有的,优秀的,且前无古人后无来者定义的  VARCHAR2 ,而是使用 CHAR 类型,写死了字符长度。

因此,在关联查询的时候就郁闷了,新建立的表就使用的 VARCHAR2 ,如果不用 TRIM 去掉 CHAR 类型的空格吧,又没办法匹配,如果用 TRIM 吧,索引又被破坏。

而且,重点是,虽然添加一个TRIM(COLUNM1)索引能提高查找效率,但是也增加了存储空间,并且影响写入效率。

怎么办!!!!怎么办!!!

还好你看了我的文章,因为我的聪明才智,想到了补全空格的方法:

RPAD(A.COLUNM1,字符长度,空格) = B.COLUNM2

这样是否完美解决了呢!

效率还倍儿高!

后来发现这不是我的原创,百度早有了。。。

 

以上是关于oracle中两个varchar2类型的时间怎么进行比较的主要内容,如果未能解决你的问题,请参考以下文章

oracle 更新一个列 原来的字段为 ‘你好么’ 更新成 ‘你好’ 为啥 会变成‘你好 ’即多了两个空格。

oracle转Mysql中,varchar2(10)和number应该转换为什么类型? (转)

Oracle怎样把varchar2型转成number型

怎么解决ORACLE 中 CHAR类型的索引问题

oracle中varchar2类型与integer类型的变量进行运算

Oracle怎么让varchar类型自动增长