我的表有一个日期时间列,记录行更新的时间;称之为col_datetime。我需要在col_datetime中获取具有最新日期时间的行以及在该记录的一分钟内具有相同分钟的所有其他记录。例如:
pk | first | col_datetime
1 Dave 2014-03-23 8:23:57
2 Dan 2014-03-23 8:22:59
3 Teresa 2014-03-23 8:23:01
4 Marge 2013-03-23 8:23:08
在我的情况下,我需要查询返回第1行和第3行(即使第2行在记录#1的1分钟内,它不是同一分钟。同样,第4行具有相同的分钟但是是一年前。)
我在mysql中的尝试只返回第1行(虽然我需要SQLAlchemy的解决方案):
SELECT * FROM (SELECT * FROM `mytable`
ORDER BY col_datetime DESC LIMIT 1) as sub
WHERE col_datetime >= sub.col_datetime - INTERVAL 1 MINUTE
AND EXTRACT(MINUTE FROM col_datetime) = EXTRACT(MINUTE FROM sub.col_datetime)
我很感激帮助!
答案 0 :(得分:3)
此sql查询将返回正确的数据:
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不支持开箱即用的DATE_FORMAT或INTERVAL等服务器端功能。要在服务器端执行此操作,请创建自定义sql构造(SQLAlchemy datetime operations on server side)。
在客户端有两个查询:
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可能有点矫枉过正。