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

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日

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向