如何查询每天8点前的最后一条记录?

本文介绍了一种SQL查询方法,用于从电表数据中提取每天8点前的最后一条记录作为前一天的读数。通过创建测试表并插入样本数据,演示了如何使用子查询和日期函数来实现这一需求。
[b]电表读数问题,电表每天按固定时间间隔读取数据,报表要求提取出每天8点前的最后一条记录做为前一天的读数,SQL语句怎么写?[/b]

Create Table TEST(ID Int, TestTime DateTime)
Insert TEST Select 1, '2007-03-29 07:30:00'
Union All Select 2, '2007-03-29 08:00:00'
Union All Select 3, '2007-03-30 07:00:00'
Union All Select 4, '2007-03-31 07:00:00'
Union All Select 5, '2007-03-31 07:50:00'
GO
Select * From TEST A
Where Not Exists(Select 1 From TEST Where DateDiff(dd, TestTime, A.TestTime) = 0 And TestTime > A.TestTime And DatePart(Hour, TestTime) < 8)
And DatePart(Hour, TestTime) < 8
GO
Drop Table TEST


--Result

ID Test Time
1 2007-03-29 07:30:00.000
3 2007-03-30 07:00:00.000
5 2007-03-31 07:50:00.000
是的,你可以使用 **原生 SQL** 在 Django 中实现每天最后一次状态的查询,尤其是在你的 MySQL 版本不支持子查询中使用 `LIMIT` 的情况下,原生 SQL 是一种更灵活且高效的替代方案。 ### 原生 SQL 查询示例: ```sql SELECT s1.* FROM status_log s1 LEFT JOIN status_log s2 ON DATE(s1.timestamp) = DATE(s2.timestamp) AND s1.timestamp < s2.timestamp WHERE s2.id IS NULL; ``` #### 说明: - 这个查询使用了 **自左连接(Self Left Join)** 的方式。 - 对于每一天的每条记录 `s1`,尝试找到同一天内时间更晚的记录 `s2`。 - 如果找不到(即 `s2.id IS NULL`),说明 `s1` 就是当天的最后一条记录。 --- ### Django 中使用原生 SQL 的方式: ```python from your_app.models import StatusLog from django.db import connection def get_daily_last_records(): with connection.cursor() as cursor: cursor.execute(""" SELECT s1.* FROM status_log s1 LEFT JOIN status_log s2 ON DATE(s1.timestamp) = DATE(s2.timestamp) AND s1.timestamp < s2.timestamp WHERE s2.id IS NULL; """) rows = cursor.fetchall() # 将结果转换为模型实例(可选) results = [] for row in rows: # row[0] 是 id, row[1] 是 timestamp, row[2] 是 status results.append(StatusLog(id=row[0], timestamp=row[1], status=row[2])) return results ``` --- ### 优: - 兼容性好:适用于不支持子查询 + limit 或窗口函数的老版本 MySQL。 - 性能较好:相比多次查询,单次 SQL 查询效率更高。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值