开发者

Which is the best way to check if timestamp/datetime belongs to a specified date

Sometimes I have a datetime or timestamp columns in the database and, for example, I need to select all records with timestamp updated today.

I usually do it like this:

SELECT * FROM mytable WHERE CAST(TS AS DATE) = CURDATE();  
SELECT * FROM mytable WHERE CAST(TS AS DATE) = '2009-11-01';

Also, it's possible to use DATE() function instead of cast:

SELECT * FROM mytable WHERE DATE(TS) = CURDATE();

The question is which way is more correct and faster? Because I'm not sure CAST for all records is a very g开发者_运维问答ood idea, maybe there is a better way...


Ok, I made some tests, here are results. First value is with index on TS column, second value is without index on TS column.

SELECT * FROM parts WHERE CAST(TS AS DATE) = DATE('2009-10-01');

2.1 sec, 2.1 sec

SELECT * FROM parts WHERE DATE(TS) = DATE('2009-10-01');

2.1 sec, 2.1 sec

SELECT * FROM parts WHERE TS >= DATE('2009-10-01') AND TS < (DATE('2009-10-01') + INTERVAL 1 DAY);

0.1 sec, 2.15 sec

SELECT * FROM parts WHERE TS >= '2009-10-01' AND TS < '2009-10-01 23:59:59';

0.1 sec, 2.15 sec


So, as you can see, there is no difference if we don't have an index on TS column. But there is a very big difference when we have index. When we use CAST() or DATE() on indexed column, the index can not be used anymore, so we get bad results.

As for me, I would choose this solution:

SELECT * FROM parts WHERE TS >= DATE('2009-10-01') AND TS < (DATE('2009-10-01') + INTERVAL 1 DAY);

I think it's the most elegant.

PS. I'm still looking for even better solutions, so if you have one - please share.


assuming you have an index on ts, this will be the fastest way because it will be able to use that index:

SELECT *
  FROM mytable
 WHERE ts >= CURDATE()
   AND ts < (CURDATE() + INTERVAL 1 DAY)


I would think its faster to actually not run a function on the database column but rather do something like this

SELECT * FROM mytable WHERE TS >= UNIX_TIMESTAMP('2009-11-01 00:00:00') AND TS <= UNIX_TIMESTAMP('2009-11-01 23:59:59');

That way the DB will only need to run the two functions one time each and can use the index of the column TS.


Run some tests.

I know our Data Warehouse uses the DATE() method and they process many millions of transactions a day, so it cannot be too bad.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜