使用jdbctemplate对varchar值求和

4bbkushb  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(356)

问候语。
我有一个mysql表time\u和一个列time\u,如下所示:

| TIME_WORKED                 | varchar(500) | YES  |     | NULL    |       |

我正在使用jdbctemplate在spring应用程序中查找总和(工作时间),如下所示:

String totalEffortQuery = "SELECT sum(TIME_WORKED) FROM time_worked WHERE USER = ? and UPDATED>= now() - INTERVAL 1 DAY";
        Long totalEffortSeconds = jdbcTemplate.queryForObject(
                totalEffortQuery, new Object[] { assignedTo }, Long.class);

但是totaleffortseconds总是有一个空值。
但当我直接在数据库中运行此查询时,它会返回以下结果:

SELECT sum(TIME_WORKED) FROM time_worked WHERE USER = 'Vishwanath Krishna Bhat' and UPDATED>= now() - INTERVAL 1 DAY;
+------------------+
| sum(TIME_WORKED) |
+------------------+
|            43200 |
+------------------+
1 row in set (0.02 sec)

我在某个地方读到,不能对非数字值使用sum,但当我直接在数据库中使用sum时,它确实起作用。
请注意,我在java代码中传递的是正确的用户值,这不是问题所在。
有人能帮我一下吗?
你好,维什瓦

2wnc66cl

2wnc66cl1#

可以将varchar值强制转换为unsigned。
修改后的查询将被删除

String totalEffortQuery = "SELECT sum(CAST(TIME_WORKED AS UNSIGNED)) FROM time_worked WHERE USER = ? and UPDATED>= now() - INTERVAL 1 DAY";
        Long totalEffortSeconds = jdbcTemplate.queryForObject(
                totalEffortQuery, new Object[] { assignedTo }, Long.class)

但这不是一种正确的方法,因为这样会消耗大量cup资源,最好将列转换为数字数据类型,如果不可能,请添加另一个具有数字数据类型的列,并在insert和update时添加触发器以存储该列中的值,以便用于此操作。

相关问题