MilitaryGirl 2023-05-29 16:00 采纳率: 100%
浏览 20
已结题

Mysql日期为VARCHAR类型,可以直接比较吗

表t1
列c1 varchar 且格式与20130529这种格式相同.
1.直接比较
select * from t1 where c1 <= '20130529';
2.用函数转为date后再比较
select * from t1 where str_to_date(c1, '%Y%m%d') <= str_to_date('20130529', '%Y%m%d');

目前倾向于直接用第一种,因为建了索引,但是怕会出错,所以想请教大家两种写法哪种更好?

  • 写回答

5条回答 默认 最新

  • 断水流大撕兄 HarmonyOS创作领域新星创作者 2023-05-29 16:15
    关注

    这两个写法有各自的优缺点:

    1. 直接比较:
      优点:
    • 如果c1有索引,查询性能会更高
      缺点:
    • c1的格式必须严格匹配'%Y%m%d',否则会导致错误结果
    • 不够灵活,如果格式变化需要修改代码
    1. 使用函数转换为DATE比较:
      优点:
    • 可以处理c1格式不统一的情况,更加灵活和安全
      缺点:
    • 如果转换过程中产生临时表,查询性能会受到影响所以,总体来说:如果c1的格式确定并统一为'%Y%m%d'且有索引,那么直接比较操作会更高效。
      如果c1的格式不确定或存在变化,使用DATE函数转换后比较,可以确保结果正确性,更加灵活。
      那么您的场景中,c1的格式是确定的'%Y%m%d',并且有索引,所以我的建议是:优先使用直接比较的方式:
    select * from t1 where c1 <= '20130529'; 
    

    这可以获得最高的查询性能。但是,为了避免c1格式在未来有变动导致错误,您也可以考虑:
    在开发环境/测试环境中使用DATE函数验证:

    select * from t1 where str_to_date(c1, '%Y%m%d') <= str_to_date('20130529', '%Y%m%d');
    

    在确认结果正确性后,再在生产环境中使用直接比较,获得最佳性能。这种方式可以在灵活性和性能之间取得一个平衡。

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

报告相同问题?

问题事件

  • 系统已结题 6月7日
  • 已采纳回答 5月30日
  • 创建了问题 5月29日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境