尔尔n 2022-04-20 09:11 采纳率: 84.6%
浏览 162
已结题

sql根据时间查询,对date类型的字段to_char

img


就是想问下,对date类型的字段to_char 这种情况的时间查询会导致查询结果出问题吗??目前试了两个时间段的查询没问题,因为之前没这么写过,搜百度都说使用to_char函数可能会造成返回结果不准确的问题

  • 写回答

2条回答 默认 最新

  • leaf_cq 2022-04-20 10:00
    关注

    1、to_char一个date就是将时间类型转换为字符类型,字符类型的大小有一定的规则,一些特殊字符可能不同的字符集或不同的比较规则输出的结果可能不同,但在正常的时间格式化上,使用【满】时间格式(所有时间位数填满)是没有问题的,但如果不是满时间规则,就很有可能出错,如:

    SELECT to_char( SYSDATE, 'yyyy-MM-d hh24:mi:ss' ) FROM dual WHERE '2022-04-4' > '2022-04-10';
    

      这个就会有数据输出,但实际上4号是小于10号的,需求上应该是没有数据输出才对

    2、从利用索引的角度上,如果accept_date字段上建有索引,那你注释掉的代码才会利用到索引,而to_char这种方法是不会利用到索引的,除非你建立了to_char( accept_date, 'yyyy-MM-dd hh24:mi:ss')的函数索引

    3、从比较效率上看,如果这个字段上没有索引、也没有函数索引或者SQL分析器会利用其他更高效的索引,单从where条件比较上,to_char会对每一行的accept_date作一次to_char运算再进行字符串比较,而to_date只会在SQL解析的时候做一次转换,剩下的每行直接进行数字比较(时间类型比较实际上应该是数字类型的比较),因此从比较效率上看应该是to_date更高效

      综上,除非你在accept_date上建立了to_char的函数索引,否则使用to_date更快才对

      另外,如果你习惯使用>=和<=来比较范围(我习惯使用between关键字),建议你使用>= '2022-04-01 00:00:00' and < '2022-04-02 00:00:00',这样可保证一个时间点在59秒到00秒时间范围内的数据,如:2022-04-01 23:59:59.010000 的不会被技术性遗漏掉

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 修改了问题 4月20日
  • 创建了问题 4月20日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效