I just find mysql can query datetime using like:
like \'2013-06-12%\'
I think it can not use the index. I Google it, but can not find such subj
One alternative for such cases is to do something like this:
SELECT *
FROM subscription t
WHERE t.active_time BETWEEN '2013-06-30 00:00:00' AND '2013-06-30 23:59:59';
In the end you get all events from that day.
Assuming that t.active_time
's type is DATETIME
,
The following query cannot use an index because of the function call. All active_time
must be converted on-the-fly to a DATE
value before comparison with '2013-06-30'
. This string is converted to a DATE
value in the very first place, and this happens only once at the very beginning of the query.
SELECT * FROM subscription t WHERE DATE(t.active_time) = '2013-06-30';
The second query cannot use an index either for similar reasons. You are actually making a string comparison (because of the LIKE
operator). All active_time
values are converted to a string on-the-fly.
SELECT * FROM subscription t WHERE t.active_time LIKE '2013-06-30%';
Only the last one can use an index. The strings '2007-11-30'
and '2007-12-01'
are cast to DATETIME
in this case, because the <
and >
operators allow this.
SELECT * FROM subscription t WHERE t.active_time > '2007-11-30' AND t.active_time < '2007-12-01';
The latter also applies to the =
and BETWEEN
operators.
For information, all types can be compared to a string with the LIKE
operator, suffering from the same problem as described above, because of the implicit conversion it requires.
t.active_time = '2013-06-30'
does not work as expected because '2013-06-30'
is cast to a DATETIME
value, that is to say '2013-06-30 00:00:00'
.