问题描述:
数据库中声明的字段类型是datetime,在SQL Server中执行sql语句查询出来的时间是正常的,可是通过项目mybatis查询出来比数据库的时间晚2天。
解决思路:
头一回遇到这个问题,有点蒙。使用下面语句查询下SQL Server上当前的时间:
select CONVERT(varchar(100), GETDATE(),20);
得出的时间是没问题的:
那问题出在哪里呢,上网一查,给的解决办法基本上是这样的:
解决方案一
将数据类型从date转换成datetime,这种方式不推荐,因为表设计好之后,一般是不再去动表结构的
解决方式二(推荐使用)
在查询所有的数据的时候进行一个sql上面的转换,convert(nvachar(100),字段),这样查出来的数据是没有问题的
解决方式三
可以替换JDBC的版本,这种方式我没有试过,就是替换JDBC的jar包,所以呢推荐是用第二种方式
第一种和第三种果断排除,我数据库中就是datetime类型,然后的我的JDBC jar是比较新的,也没问题,
然后使用方案二,结果运行报错,仔细排查才发现convert(nvachar(100),字段)中的nvachar少了个字母,准确的写法是nvarchar,改成nvarchar后,输出的时间格式不是yyyy-MM-dd HH:mm:ss,原来,SQL Server datetime转字符串大有文章,下图列出国内通俗转换:
所以MyBatis将datetime转换输出成 yyyy-MM-dd HH:mm:ss的正确写法是:
convert(nvarchar(100),CREATED_DATE,20) createdDate
这里需要提醒一下的是上面SQL中的createdDate对应实体类中相应属性,假如不加createdDate,SQL语法上没有问题,也会将时间查询出来,只是不会响应给前端接收,因此这个是万万不可缺少的。