This sql query will return the correct data:
select * from foo;
+----+--------+---------------------+
| id | name | col_date |
+----+--------+---------------------+
| 1 | Bob | 2014-04-05 19:57:53 |
| 2 | Robert | 2014-04-05 19:58:15 |
| 3 | Fred | 2014-04-05 19:58:25 |
| 4 | Frank | 2014-04-05 19:58:48 |
+----+--------+---------------------+
select foo.*
from foo,
(select convert( DATE_FORMAT(max(col_date), '%Y-%m-%d %H:%i:00'), DATETIME) as minute_base from foo) b
where foo.col_date >= b.minute_base and
foo.col_date < b.minute_base + INTERVAL 1 MINUTE;
Sqlalchemy does not support server side functions like DATE_FORMAT or INTERVAL out of the box. To do it on the server side create custom sql constructs (SQLAlchemy datetime operations on server side).
On the client side with two queries:
minute = conn.execute(select([func.max(foo.c.col_date, type=DateTime)])).scalar().replace(second=0)
max_minute = minute + datetime.timedelta(minutes=1)
conn.execute(select([foo]).\
...: where(foo.c.col_date >= minute).\
...: where(foo.c.col_date < max_minute)).fetchall()
[(2, 'Robert', datetime.datetime(2014, 4, 5, 19, 58, 15)),
(3, 'Fred', datetime.datetime(2014, 4, 5, 19, 58, 25)),
(4, 'Frank', datetime.datetime(2014, 4, 5, 19, 58, 48))]
PS max_minute may be overkill.