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上的索引失效.

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