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;
-