SQLite中基于财年(7-1至次年6-30)查询最晚降雪日期的问题
问题:SQLite中查询基于月日维度的最晚降雪记录
需求背景
- 财年周期:每年7月1日至次年6月30日
- 核心需求:从
DiaryData表中筛选snowDepth <> 0的记录,忽略年份,找出月日最晚的那条降雪记录 - 测试数据集:
| Timestamp | snowFalling | snowLaying | snowDepth |
|---|---|---|---|
| 2021-11-10 00:00:00 | 0 | 0 | 7.2 |
| 2022-09-15 00:00:00 | 0 | 0 | 9.5 |
| 2022-12-01 00:00:00 | 1 | 0 | 2.15 |
| 2022-10-13 00:00:00 | 1 | 0 | 0.0 |
| 2022-05-19 00:00:00 | 0 | 0 | 8.82 |
| 2023-01-11 00:00:00 | 0 | 0 | 3.77 |
- 预期结果:
| Timestamp | lastDate | lastDepth |
|---|---|---|
| 2022-05-19 00:00:00 | 05-19-2022 | 8.82 |
原查询的问题分析
原查询返回NULL,核心错误如下:
- WHERE子句逻辑完全错误:
lastDepth <> 0 BETWEEN ... AND ...的写法违背SQL语法逻辑,BETWEEN需要左右两边是范围值,此处把snowDepth的筛选条件和范围条件混写,导致没有任何数据匹配,最终返回NULL。 - MAX函数的比较逻辑不符合需求:
MAX(strftime('%m-%d-%Y', Timestamp))会将年份纳入比较,无法实现“忽略年份只比月日”的目标。 - 财年范围计算逻辑无效:基于每条记录的
Timestamp计算财年起始的写法,无法正确筛选指定财年的数据集,逻辑不成立。
正确的SQL实现
基础版本(忽略年份,全表找最晚月日的降雪记录)
SELECT Timestamp, strftime('%m-%d-%Y', Timestamp) AS lastDate, snowDepth AS lastDepth FROM DiaryData WHERE snowDepth <> 0 ORDER BY strftime('%m-%d', Timestamp) DESC LIMIT 1;
逻辑说明
WHERE snowDepth <> 0:先筛选出有降雪的有效记录strftime('%m-%d', Timestamp):提取日期的月日部分,以此作为排序依据ORDER BY ... DESC:按月日降序排列,月日最晚的记录会排在首位LIMIT 1:取出排序后的第一条记录,即为目标结果
结合财年范围的版本(可选)
如果需要限定查询某一财年的记录(例如2023财年:2022-07-01至2023-06-30),可以添加财年时间范围筛选:
SELECT Timestamp, strftime('%m-%d-%Y', Timestamp) AS lastDate, snowDepth AS lastDepth FROM DiaryData WHERE snowDepth <> 0 AND Timestamp BETWEEN '2022-07-01' AND '2023-06-30' ORDER BY strftime('%m-%d', Timestamp) DESC LIMIT 1;
测试验证
针对提供的测试数据,执行基础版本SQL后,会返回预期结果:
| Timestamp | lastDate | lastDepth |
|---|---|---|
| 2022-05-19 00:00:00 | 05-19-2022 | 8.82 |
内容的提问来源于stack exchange,提问作者surban21
相关产品推荐
相关产品推荐

