目录
1、使用场景
因为本人最近的一个项目之中,修改同事以前做的一个功能(待办事项),此接口主要提提供给移动端App的,里面主要包含了两部分内容:(1)、新手任务信息,(2)、其他任务[任务的开始时间大于当前时间]。
因为以前的业务设计的是,任务的开始时间必须大于今天;但是随着销售和实际情况的需求,任务的开始时间和结束时间需要精确到年月日,时分。并且由于以前同事根据时间的大小获得时间后,然后获得时间的毫秒数,进行比较后,给前端提供接口时候做了一个;转换显示工具类。具体可以看第二部的代码。
开始以为直接转换和修改一下比较时间大小(开始时间与Now()相比,最近24小时内的即可),结果一修改返现返回的开始时间都是开始时间的00:00:00秒,明显开始时间是2019-01-24 14:00:00;结果与现在时间2019-01-24 10:22:00 相减比较还是一个负数。结果已修改其他地方也出现错误了。最后挖掘根源是MyBatis的配置之中;任务的开始时间为DATE类型。后面调整为 TIMESTAMP
2、代码实现
未修改之前的情况如下:
<!-- 注意 task_start_time 开始 jdbcType="DATE"-->
<resultMap id="TaskToDoResultMap" type="cn.com.demos.task.entity.extend.TaskToDoExtend">
<result column="task_id" jdbcType="BIGINT" property="taskId" />
<result column="task_name" jdbcType="CHAR" property="taskName" />
<result column="complete_status" jdbcType="CHAR" property="completeStatus" />
<result column="task_end_date" jdbcType="DATE" property="taskEndDate" />
<result column="task_start_time" jdbcType="DATE" property="startTime" />
<result column="isExpiring" property="isExpiring" />
<result column="isMarking" property="isMarking" />
<result column="task_type" property="taskType" />
</resultMap>
<!-- 任务待办事项 -->
<select id="getTaskToDoList" resultMap="TaskToDoResultMap">
------
</select>
修改之后的
主要修改内容 <result column="task_start_time" jdbcType="TIMESTAMP" property="startTime" />
<resultMap id="TaskToDoResultMap" type="cn.com.demos.task.entity.extend.TaskToDoExtend">
<result column="task_id" jdbcType="BIGINT" property="taskId" />
<result column="task_name" jdbcType="CHAR" property="taskName" />
<result column="complete_status" jdbcType="CHAR" property="completeStatus" />
<result column="task_end_date" jdbcType="DATE" property="taskEndDate" />
<result column="task_start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="isExpiring" property="isExpiring" />
<result column="isMarking" property="isMarking" />
<result column="task_type" property="taskType" />
</resultMap>
<!-- 任务待办事项 -->
<select id="getTaskToDoList" resultMap="TaskToDoResultMap">
<!-- 普通任务 -->
(
SELECT ta.task_id, ti.task_name, ta.complete_status, DATE(ti.task_end_time) as task_end_date,
ti.`task_start_time`,
IF(DATEDIFF(ti.task_end_time,NOW()) < 1 AND ta.complete_status IN('01', '02')
AND DATEDIFF(ti.task_end_time,NOW()) >= 0, TRUE, FALSE) AS isExpiring,
IF(ta.complete_status IN('01', '02') AND ti.task_end_time < NOW(), TRUE, FALSE) AS isMarking,
ti.task_type FROM task_assign ta LEFT JOIN task_info ti
ON ta.task_id = ti.id
WHERE ta.user_id = #{userId} AND ta.complete_status IN('01', '02')
and ti.task_end_time > now()
ORDER BY DATE(ti.task_end_time) DESC
)
UNION
<!-- 普通新手任务 -->
(
SELECT ta.task_id, ti.task_name, ta.complete_status, DATE(ti.task_end_time) as task_end_date,
ti.`task_start_time`,
IF(DATEDIFF(ti.task_end_time,NOW()) < 1 AND ta.complete_status IN('01', '02')
AND DATEDIFF(ti.task_end_time,NOW()) >= 0, TRUE, FALSE) AS isExpiring,
IF(ta.complete_status IN('01', '02') AND ti.task_end_time < NOW(), TRUE, FALSE) AS isMarking,
ti.task_type FROM task_assign_beginner ta LEFT JOIN task_info_beginner ti
ON ta.task_id = ti.id
WHERE ta.user_id = #{userId} AND ta.complete_status IN('01', '02')
and ti.task_end_time > now()
ORDER BY DATE(ti.task_end_time) DESC
)
</select>
3、展现结果
3.1、未修改的情况下展示结果
很明显返回显示的日期和时间是不对的。于是我debug可以看见时间与当前时间比较是负数。
3.2、修改调整后展示的结果
4、总结
在实际工作之中,我们在涉及到开始时间或者时间字段时候,在配置Mybatis之中resulMap之中,尽量配置为 jdbcType="TIMESTAMP" ,因为此时可以返回时分秒。这样能够在比较时或者显示显示到时分秒。
当jdbcType="DATE"类型时,返回的时间只有年月日(yyyy-MM-dd)的,当jdbcType=“TIMESTAMP”的时候,返回的时间是年月日和时分秒(yyyy-MM-dd HH:mm:ss)
5、参考文章