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中转时间操作三选一:

      1. time_to_sec(timediff(t2, t1))
      2. timestampdiff(second, t1, t2)
      3. unix_timestamp(t2) -unix_timestamp(t1)
    • kingbase的话,求秒数差:

    • 前端获取秒数可以先 Math.round() 四舍五入(原理就是加0.5,然后向下取整),然后自行换算得到时分秒,如:

      • Math.floor:向下取整
      • hours = Math.floor( xxx / (60 * 60) );
      • minutes = Math.floor( ( xxx % (60 * 60) ) / 60 );
      • seconds = xxx % 60;
posted @ 2024-03-23 14:31  朱呀朱~  阅读(14)  评论(0编辑  收藏  举报