求助,oracle数据库,除了to_char还有什么其他方法可以同时获取到系统的年月吗

求助,oracle数据库,除了to_char  还有什么其他方法可以同时获取到系统的年月吗。

to_char 会破坏索引,执行速度太慢了

FineReport DKS892DJDSAw 发布于 2023-2-22 16:51
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共5回答
最佳回答
0
CD20160914Lv8专家互助
发布于2023-2-22 21:59

根本就不用转换的。假如你的oracel里面是真正的日期格式,那么你不要转换,因为日期有索引,同时还是非字符串,它的判断肯定比字符串的,所以你只要直接比较大小就行了,就直接把参数拼一下。如果你的参数是年月的格式,那么直接这样写就行了

${if(len(year_month)=0,"","and mytime>=to_date('"+CONCATENATE(year_month,"-01")+"','yyyy-mm-dd') 

and mytime<to_date('"+DATEDELTA(DATEINMONTH(CONCATENATE(year_month,"-01"),-1),1)+"','yyyy-mm-dd')")}

下面截图就是传的是年月的格式,最后通过帆软函数再加上oracel的函数将它转换成的数据,这样的sql最后就会查询你整个2022-02月的数据,而且你的日期字段并没有转换,也会保留索引!我一直是这样操作的,没有任何问题的,查询从来不会慢,除非你的数据超级多,有几个亿

image.png

最佳回答
0
就TM你叫夏洛啊Lv6中级互助
发布于2023-2-22 16:53

to_date()  ,  left(日期,10) 都可以

最佳回答
0
weibwLv7高级互助
发布于2023-2-22 16:54(编辑于 2023-2-22 16:56)

系统年月怎么会影响你索引呢?如果你是要拿你的字段和当前时间比较,那应该是将函数处理放在获取系统时间那块,另外,如果你时间字段不是时间类型是字符串类型,建议你另存一个字段为时间或者数字20230222这样的,然后再比较就不会影响使用索引了

  • DKS892DJDSAw DKS892DJDSAw(提问者) 因为是让表里的年月等于系统的年月,如果对表里的日期字段用to_char,就影响索引了
    2023-02-22 16:57 
  • weibw weibw 回复 DKS892DJDSAw(提问者) 你表里日期字段不是日期类型吗?如果不是的话,你这条路应该是无解的,只要比较日期就必须两个比较字段都得是日期,不然索引就会失效
    2023-02-22 16:58 
  • DKS892DJDSAw DKS892DJDSAw(提问者) 我的时间字段是日期类型的,而且精确到日,要把它转换为年月的格式
    2023-02-22 16:58 
  • weibw weibw 回复 DKS892DJDSAw(提问者) 如果你的字段也是日期类型,那就可以直接比较啊,你的字段=sysdate
    2023-02-22 17:01 
  • DKS892DJDSAw DKS892DJDSAw(提问者) 回复 weibw 因为现在字段是精确到日的,我只想比较年月啊,不想比较到日
    2023-02-22 17:03 
最佳回答
0
HHHHH123Lv7中级互助
发布于2023-2-22 16:56
select sysdate 当前日期,extract(hour from timestamp timestamp sysdate) 小时,extract(DAY from sysdate ) 日,extract(MONTH from sysdate ) 月,extract(YEAR from sysdate ) 年 from dual;

最佳回答
0
YmengLv5中级互助
发布于2023-2-22 17:01(编辑于 2023-2-22 17:01)

用like , 字段 like to_char(syadate,'yyyy-mm')||'%'

like会走索引

  • 6关注人数
  • 476浏览人数
  • 最后回答于:2023-2-22 21:59
    请选择关闭问题的原因
    确定 取消
    返回顶部