尔尔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日

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器