По крайней мере, в MySQL v5.1.73 (CentOS 6.6) функция MOD() возвращает фиктивный результат ... если кто-то не может объяснить, как это действительно правильно.MySQL MOD() не работает: это лучшая альтернатива?
mysql> select MOD(-385.4784399 ,1440);
+-------------------------+
| MOD(-385.4784399 ,1440) |
+-------------------------+
| -385.4784399 |
+-------------------------+
1 row in set (0.01 sec)
Это лучшая альтернатива?
mysql> select -385.478439885319 - 1440 * FLOOR(-385.478439885319/1440);
+----------------------------------------------------------+
| -385.478439885319 - 1440 * FLOOR(-385.478439885319/1440) |
+----------------------------------------------------------+
| 1054.521560114681 |
+----------------------------------------------------------+
1 row in set (0.00 sec)
Я думаю, что это сработает, но все идет полным ходом, чтобы сделать что-то простое.
mysql> select MOD((MOD(-385.478439885319, 1440) + 1440), 1440);
+--------------------------------------------------+
| MOD((MOD(-385.478439885319, 1440) + 1440), 1440) |
+--------------------------------------------------+
| 1054.521560114681 |
+--------------------------------------------------+
1 row in set (0.00 sec)
Это не сломлен, если нет какой-либо спецификации, вы можете указать, что она не встречается. Он определен в документации как остаток, и ни один пример не приведен с отрицательным первым аргументом. – EJP
Какой результат вы ожидаете? MOD работает по модулю и возвращает остаток '-385.478439885319', деленный на' 1440'. Результат операции modulo не может быть больше, чем divisor. – Nicolai
Это базовая модульная арифметика, и я ожидаю правильный ответ ... и я даже показал правильный ответ; Я просто не уверен, что это самый эффективный способ сделать это. – tlum