Использование JDBCTemplate для суммы по значению varchar - PullRequest
0 голосов
/ 25 сентября 2018

Привет.

У меня есть таблица MySQL Time_worked со столбцом Time_worked следующим образом:

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

Я пытаюсь найти сумму (Time_Worked) в приложении Spring с использованием JDBCTemplateследующим образом:

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 всегда имеет значение NULL.

Но когда я запускаю этот запрос непосредственно в базе данных следующим образом, он возвращает результаты:

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 для нечисловых значений, но он работает, когда я использую его непосредственно в базе данных.

Пожалуйста, обратите внимание, что я передаю правильное значение USER в своем коде Java иэто не проблема.

Может кто-нибудь помочь мне с этим?

С уважением, Вишва

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете привести значение 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)

, но это неправильный способ, потому что это может потреблять много ресурсов чашки, лучше выможно преобразовать столбец в числовой тип данных, если это невозможно, добавить другой столбец с числовым типом данных и добавить триггер при вставке и обновлении, чтобы сохранить значение в этом столбце, чтобы вы могли использовать его для этой операции.

...