检索指定时间范围内的数据与预期不一致

本文探讨了在Mybatis中使用精确到时分秒的日期参数进行数据库查询时遇到的问题及解决方案,详细介绍了如何避免因日期处理不当导致的数据统计错误。
问题背景:
在不同日期内进行不同的业务逻辑,在测试环境进行模拟,将日期设置当天时间,通过时分秒区分不同的日期;
不在此时间区间内的数据被统计到了此时间区间内;

问题定位:
Mybatis配置文件中SQL
parameterType = map
确认传入的时间参数为字符串,格式为 yyyy-MM-dd HH:mm:SS,精确到时分秒,符合datetime 类型

查看SQL:

SELECT * FROM `p2p_td_project_invest`
WHERE 1=1
AND DATE(C_CREATE_TIME) >= DATE("2017-10-27 18:31:00")
AND DATE(C_CREATE_TIME) <= DATE("2017-10-27 18:45:00")
ORDER BY C_CREATE_TIME DESC LIMIT 10 ;


使用了 DATE 函数

SELECT DATE(C_CREATE_TIME) FROM p2p_td_project_invest ORDER BY C_CREATE_TIME DESC LIMIT 10 ;
-- 查询结果为 yyyy-MM-dd


SELECT DATE("2017-10-27 18:45:00") FROM DUAL ;
-- 查询结果为 yyyy-MM-dd


即,虽然传入的参数为 yyyy-MM-dd HH:mm:SS 格式,经过 DATE 处理后变为 yyyy-MM-dd 格式

解决方式:

SELECT * FROM `p2p_td_project_invest`
WHERE 1=1
AND C_CREATE_TIME >= DATE("2017-10-10")
AND C_CREATE_TIME <= DATE("2017-10-19")
ORDER BY C_CREATE_TIME DESC LIMIT 10 ;
-- 去掉字段上的DATE 函数,结果正确



SELECT * FROM `p2p_td_project_invest`
WHERE 1=1
AND C_CREATE_TIME >= "2017-10-27 00:00:00"
AND C_CREATE_TIME <= "2017-10-27 23:59:59"
ORDER BY C_CREATE_TIME DESC LIMIT 10 ;



但这样修改是不对的,C_CREATE_TIME 是 datetime 类型,而等号右侧未指定时分秒是默认0时0分0秒

SELECT * FROM `p2p_td_project_invest`
WHERE 1=1
AND C_CREATE_TIME >= "2017-10-27"
AND C_CREATE_TIME <= "2017-10-27"
ORDER BY C_CREATE_TIME DESC LIMIT 10 ;


[url]http://www.w3school.com.cn/sql/sql_dates.asp[/url]
使用时间字段为了查询准确,建议只是用日期部分,可以将截止日志后延一天,以期取到时间范围
### Excel 中处理行列数同的矩阵进行匹配 在Excel中,当面对两个行列数一致的矩阵时,可以采用多种策略来进行数据匹配。这些方法仅能够有效地解决尺寸差异带来的挑战,还能保持数据一致性和准确性。 #### 使用VLOOKUP或HLOOKUP函数 对于简单的查找需求,`VLOOKUP` 和 `HLOOKUP` 函数是非常实用的选择。这两个函数分别用于垂直方向和水平方向上的查找操作。假设有一个较小规模的目标矩阵A(m×n)以及较大规模源矩阵B(p×q),其中 m<p 或者 n<q,则可以根据共同键值从 B 中提取对应行或列的信息填充到 A 中[^1]。 ```excel =VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup]) ``` 这里需要注意的是,在实际应用过程中可能需要调整参数设置以适应具体场景下的索引位置变化情况;另外如果存在多对一映射关系的话还需要额外考虑去重等问题。 #### 利用INDEXMATCH组合实现更灵活查询 为了获得更高的灵活性并支持跨工作表甚至文件间的数据关联,推荐使用 `INDEX` 配合 `MATCH` 的方式完成复杂模式下两组同规格数组之间的精准定位: - **INDEX**: 返回给定范围内指定行号及列号处单元格的内容; - **MATCH**: 寻找某个特定项首次出现的位置序号。 通过上述两者联合运用可构建如下表达式来获取目标区域内的任意元素坐标,并据此实施进一步加工处理[^2]: ```excel =INDEX(array, MATCH(row_lookup_value, row_range, 0), MATCH(col_lookup_value, col_range, 0)) ``` 此方案特别适用于那些既希望保留原始布局又追求高效检索性能的应用场合。 #### 数据透视表辅助转换 针对某些特殊情形——比如一方为宽表格另一方则是长列表形式存储时,借助于“数据透视表”的强大汇总统计能力往往能起到意想到的效果。先将其中一个对象转置成对方相同结构之后再做对比分析会变得更加直观简便[^3]. 综上所述,虽然直接在同一张电子表格内同步修改大小各异且形状对齐的对象并非易事,但凭借以上介绍的技术手段完全可以克服这一难题,进而达成预期目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值