Suppose the table's layout is as follows: CREATE TABLE mytable ( id int not null auto_increment, col1 datetime, col2 datetime, primary key (id) ); You may want to try one of two things # IDEA #1 : Create a column to store difference in seconds Create the column and populate as follows ALTER TABLE mytable ADD COLUMN dtdiff INT NOT NULL; ALTER TABLE mytable ADD INDEX (dtdiff); UPDATE mytable SET dtdiff = UNIX_TIMESTAMP(col1) - UNIX_TIMESTAMP(col2)l If your table does not have foreign keys or constraints, do this instead: CREATE TABLE mytable_new LIKE mytable; ALTER TABLE mytable_new ADD COLUMN dtdiff INT NOT NULL; ALTER TABLE mytable_new ADD INDEX (dtdiff); INSERT INTO mytable_new SELECT id,col1,col2, UNIX_TIMESTAMP(col1) - UNIX_TIMESTAMP(col2) FROM mytable ; ALTER TABLE mytable RENAME mytable_old; ALTER TABLE mytable_new RENAME mytable; DROP TABLE mytable_old; Once done, your query would essentially - `SELECT * FROM mytable WHERE dtdiff > 0` for `col1 > col2` - `SELECT * FROM mytable WHERE dtdiff < 0` for `col1 < col2` # IDEA #2 : Create a separate table to store difference in seconds CREATE TABLE mytable_dtdiff ( id int not null, dtdiff int not null, primary key (id), key dtdiff (dtdiff) ); INSERT INTO mytable_dtdiff SELECT id,UNIX_TIMESTAMP(col1) - UNIX_TIMESTAMP(col2) FROM mytable; Once done, your query would essentially SELECT B.* FROM (SELECT id FROM mytable_dtdiff WHERE dtdiff > 0) A LEFT JOIN mytable B USING (id); for `col1 > col2` and SELECT B.* FROM (SELECT id FROM mytable_dtdiff WHERE dtdiff < 0) A LEFT JOIN mytable B USING (id); for `col1 < col2` Give it a Try !!!