oracle 时间的计算。。。。。。

时间:2023-01-28 17:05:38
我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s,
to_date(to_char(l_time,'999999'),'HH24:MI:SS') 用这种方法转换得到的时间里有日期,我是想纯粹的用时间不带日期比较。。

哪位高手有好的方法,小弟跪谢了。。。



14 个解决方案

#1


我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s, 

把sysdate的时间转成6位数字不就可以比较了吗。。。。
131224to_char(sysdate,'hh24miss')比较就行了吧

#2


引用 1 楼 liusong_china 的回复:
我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s,

 把sysdate的时间转成6位数字不就可以比较了吗。。。。
 用131224和to_char(sysdate,'hh24miss')比较就行了吧

字符串不好计算的,要取差值后怎么转换为秒呢

#3


你的131224,不指定是今天的131224,还是昨天的131224,或者是别的某天?
如何与sysdate比较相差多少秒呢?逻辑上就通过不。

就算你默认131224就是指与sysdate同一天的131224,那你也应该在代码中指定,
不然oracle怎么知道你脑袋中的想法。这是写sql最基本的常识。

你的这个需求明确后也不难,用ls的方法或者用extract函数都能实现。

#4


引用 2 楼 mandarin 的回复:
引用 1 楼 liusong_china 的回复:
我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s,

把sysdate的时间转成6位数字不就可以比较了吗。。。。
用131224和to_char(sysdate,'hh24miss')比较就行了吧

字符串不好计算的,要取差值后怎么转换为秒呢


不考虑日期(假设同一天),6位数字分为hh mi ss,将hh和mi转换成ss不就行了,(hh*60+mi)*60+ss不就是秒了。。。然后做差可以吧。。

#5


引用楼主 mandarin 的回复:
我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s,
 to_date(to_char(l_time,'999999'),'HH24:MI:SS') 用这种方法转换得到的时间里有日期,我是想纯粹的用时间不带日期比较。。

 哪位高手有好的方法,小弟跪谢了。。。


datefile-trunc(datefile, 'D') 这样一减就是小时的零头叻。

#6


引用楼主 mandarin 的回复:
我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s,
 to_date(to_char(l_time,'999999'),'HH24:MI:SS') 用这种方法转换得到的时间里有日期,我是想纯粹的用时间不带日期比较。。

 哪位高手有好的方法,小弟跪谢了。。。


或者直接用to_char的hh24miss提出来。

SQL> select to_char(sysdate,'hh24miss') from dual;

TO_CHAR(SYSDATE,'H
------------------
221027

#7


lz想判断相差多少秒,所以要在date类型下相减,221027-131224=?秒

#8


引用 4 楼 liusong_china 的回复:
 不考虑日期(假设同一天),6位数字分为hh mi ss,将hh和mi转换成ss不就行了,(hh*60+mi)*60+ss不就是秒了。。。然后做差可以吧。。

你如何转换能做到不丢精度?

#9


引用 8 楼 vc555 的回复:
引用 4 楼 liusong_china 的回复:
不考虑日期(假设同一天),6位数字分为hh mi ss,将hh和mi转换成ss不就行了,(hh*60+mi)*60+ss不就是秒了。。。然后做差可以吧。。

你如何转换能做到不丢精度?

to_char(sysdate,'hh24')*3600+to_char(sysdate,'mi')*60+to_char(sysdate,'ss')
减去
substr(131224,1,2)*3600+substr(131224,3,2)*60+substr(131224,5,2)
可以吗?

会有精度丢失吗?

#10


会的。今天太晚了。我明天再说精度这个问题吧。

#11


引用 10 楼 vc555 的回复:
会的。今天太晚了。我明天再说精度这个问题吧。

#12


加群交流学习:69705156

#13


感谢ls的几位。
我的l_time是作为当天的时间,所以与sysdate的时间部分比较,看了大家的回帖,我觉得可以这个样子:(to_date(to_char(b.l_end_time,'999999'),'HH24:MI:SS')-to_date(to_char(sysdate,'hh24miss'),'HH24:MI:SS'))* 24 * 3600

#14


select 131224 - to_number(to_char(sysdate,'hh24miss')) from dual;

只要上面返回的结果的绝对值(abs)大于10,那么时差就大于10s

#1


我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s, 

把sysdate的时间转成6位数字不就可以比较了吗。。。。
131224to_char(sysdate,'hh24miss')比较就行了吧

#2


引用 1 楼 liusong_china 的回复:
我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s,

 把sysdate的时间转成6位数字不就可以比较了吗。。。。
 用131224和to_char(sysdate,'hh24miss')比较就行了吧

字符串不好计算的,要取差值后怎么转换为秒呢

#3


你的131224,不指定是今天的131224,还是昨天的131224,或者是别的某天?
如何与sysdate比较相差多少秒呢?逻辑上就通过不。

就算你默认131224就是指与sysdate同一天的131224,那你也应该在代码中指定,
不然oracle怎么知道你脑袋中的想法。这是写sql最基本的常识。

你的这个需求明确后也不难,用ls的方法或者用extract函数都能实现。

#4


引用 2 楼 mandarin 的回复:
引用 1 楼 liusong_china 的回复:
我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s,

把sysdate的时间转成6位数字不就可以比较了吗。。。。
用131224和to_char(sysdate,'hh24miss')比较就行了吧

字符串不好计算的,要取差值后怎么转换为秒呢


不考虑日期(假设同一天),6位数字分为hh mi ss,将hh和mi转换成ss不就行了,(hh*60+mi)*60+ss不就是秒了。。。然后做差可以吧。。

#5


引用楼主 mandarin 的回复:
我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s,
 to_date(to_char(l_time,'999999'),'HH24:MI:SS') 用这种方法转换得到的时间里有日期,我是想纯粹的用时间不带日期比较。。

 哪位高手有好的方法,小弟跪谢了。。。


datefile-trunc(datefile, 'D') 这样一减就是小时的零头叻。

#6


引用楼主 mandarin 的回复:
我数据库表中有一个字段l_time是number类型的,如:131224,想通过它与sysdate比较,判断两者时间差是否大于10s,
 to_date(to_char(l_time,'999999'),'HH24:MI:SS') 用这种方法转换得到的时间里有日期,我是想纯粹的用时间不带日期比较。。

 哪位高手有好的方法,小弟跪谢了。。。


或者直接用to_char的hh24miss提出来。

SQL> select to_char(sysdate,'hh24miss') from dual;

TO_CHAR(SYSDATE,'H
------------------
221027

#7


lz想判断相差多少秒,所以要在date类型下相减,221027-131224=?秒

#8


引用 4 楼 liusong_china 的回复:
 不考虑日期(假设同一天),6位数字分为hh mi ss,将hh和mi转换成ss不就行了,(hh*60+mi)*60+ss不就是秒了。。。然后做差可以吧。。

你如何转换能做到不丢精度?

#9


引用 8 楼 vc555 的回复:
引用 4 楼 liusong_china 的回复:
不考虑日期(假设同一天),6位数字分为hh mi ss,将hh和mi转换成ss不就行了,(hh*60+mi)*60+ss不就是秒了。。。然后做差可以吧。。

你如何转换能做到不丢精度?

to_char(sysdate,'hh24')*3600+to_char(sysdate,'mi')*60+to_char(sysdate,'ss')
减去
substr(131224,1,2)*3600+substr(131224,3,2)*60+substr(131224,5,2)
可以吗?

会有精度丢失吗?

#10


会的。今天太晚了。我明天再说精度这个问题吧。

#11


引用 10 楼 vc555 的回复:
会的。今天太晚了。我明天再说精度这个问题吧。

#12


加群交流学习:69705156

#13


感谢ls的几位。
我的l_time是作为当天的时间,所以与sysdate的时间部分比较,看了大家的回帖,我觉得可以这个样子:(to_date(to_char(b.l_end_time,'999999'),'HH24:MI:SS')-to_date(to_char(sysdate,'hh24miss'),'HH24:MI:SS'))* 24 * 3600

#14


select 131224 - to_number(to_char(sysdate,'hh24miss')) from dual;

只要上面返回的结果的绝对值(abs)大于10,那么时差就大于10s