lealone / Lealone

比 MySQL 和 MongoDB 快10倍的 OLTP 关系数据库和文档数据库
Other
2.44k stars 514 forks source link

一个日期诡异的问题 #198

Closed cbqqkcel closed 1 year ago

cbqqkcel commented 1 year ago
<sql id="monthWhere">
        <where>
            <if test="cond.skuId != null">
                skuId = #{cond.skuId}
            </if>
            and formatdatetime(isl.createAt, 'yyyy-MM') between '2023-08' and '2023-08'
        </where>
    </sql>

    <select id="monthCount">
        SELECT COUNT(*) from (
        SELECT 1 FROM IoStockLog isl
        <include refid="monthWhere"/>
        GROUP BY skuId, FORMATDATETIME(createAt, 'yyyy-MM')
        )
    </select>

    <select id="month" resultType="cn.com.idmy.wms.model.out.StockCountOut">
        SELECT skuId,
            s.name AS skuName,
            formatdatetime(isl.createAt, 'yyyy-MM') AS date,
            SUM(CASE io WHEN 1 THEN qty ELSE 0 END) AS inQty,
            SUM(CASE io WHEN 1 THEN isl.price ELSE 0 END) AS inPrice,
            SUM(CASE io WHEN -1 THEN qty ELSE 0 END) AS outQty,
            SUM(CASE io WHEN -1 THEN isl.price ELSE 0 END) AS outPrice
        FROM IoStockLog isl
            INNER JOIN Sku s ON isl.skuId = s.id
        <include refid="monthWhere"/>
        GROUP BY skuId, FORMATDATETIME(isl.createAt, 'yyyy-MM')
        ORDER BY isl.createAt DESC, skuId LIMIT #{offset},#{pageSize}
    </select>

上面的代码会报以下错误 java.lang.IllegalArgumentException: 2023-08 at org.lealone.common.util.DateTimeUtils.parseDateValue(DateTimeUtils.java:267) ~[lealone-common-5.2.0-SNAPSHOT.jar:na] at org.lealone.db.value.ValueTimestamp.parseTry(ValueTimestamp.java:108) ~[lealone-common-5.2.0-SNAPSHOT.jar:na] at org.lealone.db.value.ValueTimestamp.parse(ValueTimestamp.java:89) ~[lealone-common-5.2.0-SNAPSHOT.jar:na] at org.lealone.db.value.Value.convertTo(Value.java:882) ~[lealone-common-5.2.0-SNAPSHOT.jar:na] at org.lealone.db.value.Value.getTimestamp(Value.java:409) ~[lealone-common-5.2.0-SNAPSHOT.jar:na] at org.lealone.client.jdbc.JdbcResultSet.getTimestamp(JdbcResultSet.java:474) ~[lealone-client-5.2.0-SNAPSHOT.jar:na] at org.apache.ibatis.type.DateTypeHandler.getNullableResult(DateTypeHandler.java:37) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.type.DateTypeHandler.getNullableResult(DateTypeHandler.java:28) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:86) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyAutomaticMappings(DefaultResultSetHandler.java:582) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:412) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:362) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:333) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:306) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:202) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:66) ~[mybatis-3.5.13.jar:3.5.13]

但是把打印的 sql 放到工具上执行又是可以的 image

如果把'yyyy-MM' 改成 'yyyy-MM-dd' 又不会报错了

cbqqkcel commented 1 year ago

monthCount 执行是不会报错的。执行 month 语句才报的错误

codefollower commented 1 year ago

FORMATDATETIME 这个函数返回的是字符串,ibatis 收到的结果就已经是字符串“2023-08”了,它调用 ResultSet.getTimestamp(int) 时又把这个字符串转成 java.sql.Timestamp 对象,java.sql.Timestamp 在解析字符串 “2023-08” 时认为它不合法所以就抛异常了。

在命令行客户端执行那条 SQL 执行的是 ResultSet.getString(int) 或 ResultSet.getObject(int) ,直接就返回字符串 “2023-08” 了,所以不会报错。

codefollower commented 1 year ago

StockCountOut 这个类映射的字段类型变成 String 后看看 ibatis 是否调用 ResultSet.getString(int)

cbqqkcel commented 1 year ago

改成字符串可以了

kom0055 commented 9 months ago

改成字符串可以了

老哥好多issues 都是你提的,值得一个contributer了

cbqqkcel commented 9 months ago

改成字符串可以了

老哥好多issues 都是你提的,值得一个contributer了

我有吸引Bug的体制,什么软件到我手上,都要出问题。