sql 处理时间
mapper 中关于时间部分的 sql
时间范围内查询
-
mapper 里使用(这里用的是人大金仓数据库语法,是 String 的日期进行了转换):
<if test="startTime != null and startTime != ''"> AND <![CDATA[ b.cjsj >= #{startTime,jdbcType=VARCHAR}]]> </if> <if test="endTime != null and endTime != ''"> AND <![CDATA[ b.cjsj <= TO_CHAR((TO_DATE(#{endTime,jdbcType=VARCHAR}) + 1 ),'%Y-%m-%d')]]> </if>
- 结束时间加一才能拿到结束日期当天的数据(尽管是 <=)
-
mysql 语法:
<if test="endTime != null and endTime != ''"> AND <![CDATA[ cjsj <= DATE_FORMAT(DATE_ADD(#{endTime,jdbcType=VARCHAR},INTERVAL 1 DAY),'%Y-%m-%d')]]> </if>
-
平常的时间上的操作,也常见使用
between and
<if test="startTime != null and endTime != null "> AND CY_YYALSJ.JYRQ BETWEEN #{startTime} AND #{endTime} </if>
- 但这样的话就必须是既有开始时间也要有结束时间了
时间的加减
-
关于时间方面的加减计算
-
mysql 认为时间本就是需要用函数才能进行计算的,所以
SUM( LOGOUT_TIME - LOGIN_TIME ) loggingTime,
这种写法应该是不对的,所得结果并不正确,其计算的不是时间差,而是 mysql 中间做了一个转换操作,把时间如:2023-01-03 08:44:44 转换成了 20230103084444 进行的计算得到的秒数差-
主要就是记住时间不能在数据库中加减操作
-
sql中转时间操作三选一:
time_to_sec(timediff(t2, t1))
timestampdiff(second, t1, t2)
unix_timestamp(t2) -unix_timestamp(t1)
-
kingbase的话,求秒数差:
- (跟毫秒值有关):
date_part('epoch', create_time)-date_part('epoch', update_time)
- 参考文章:kingbase8关于时间的用法
- (跟毫秒值有关):
-
前端获取秒数可以先 Math.round() 四舍五入(原理就是加0.5,然后向下取整),然后自行换算得到时分秒,如:
- Math.floor:向下取整
- hours = Math.floor( xxx / (60 * 60) );
- minutes = Math.floor( ( xxx % (60 * 60) ) / 60 );
- seconds = xxx % 60;
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义