sql 中 对日期类型和日期格式的字符串进行比较的记录

select * from tableName where data_date >= '" + start_date + "' and data_date <= '" + end_date + "' and meter_id = '" + meter_id + "' order by data_date  asc 

在进行数据库中Date类型和日期格式的字符串进行比较时, 在数据库表设计中日期类型具有索引的情况下 , mysql的查询操作还会不会依赖索引呢?

带着这个问题看了很多博客. 归纳了一下, 给自己记录下来.

首先 , mysql在比较不同格式的数据时, 需要先将不同格式的数据转成同一格式的数据进行比较. 那么现在情况就分为两种.

1: 将日期格式的字符串转为日期类型再进行比较 (String -> Date)

2: 将日期类型转为字符串类型再和日期格式的字符串进行比较. ( Date -> String )

在Mysql 中, 是先将 String 转为Date , 即先将日期格式的字符串转为Date, 然后在对两个Date进行比较.

我猜这是因为表结构中日期是Date类型, Mysql需要将待比较的类型转成和数据库表字段相同的类型再进行比较.

其比较时间长度排序为: 

        字符串间的比较 < 日期类型的比较  <  日期和字符串的比较

在pgsql中,如果sql语句中对表字段加 函数,则这个字段的索引不走, 但是对传来的参数加函数,不影响走不走字段索引的事情.

所以, 查询时可以把传入的参数用函数转成和表字段对应的类型 ,但是不要在表字段上加函数. 在表字段上加函数, 如果表字段有索引, 那这个索引就不走了.

使用FORMAT_DATE函数时 , Date列的索引不起作用. 在Mysql中, 凡是使用了函数的列 , 都不会依赖索引比较.

如果表中date字段是Date类型并且加了索引的话,  使用日期格式的字符串和date进行比较, Mysql会把字符串先转成日期格式, 这时日期的date是有索引的 , 所以查询依然高效.   但如果使用FORMAT_DATE函数, 则date上的索引失效.

以上只是自己的理解, 不一定正确.  如果大佬们有不同的理解, 欢迎评论下留言.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值