PHP / MySQLi - выбор из 2 баз данных [дубликат]

Я согласен с выбранным ответом на использование DecimalFormat --- или альтернативно BigDecimal.

Пожалуйста, сначала прочтите Обновление ниже!

Однако, если вы хотите округлить двойное значение и получить результат значения double, вы можете использовать org.apache.commons.math3.util.Precision.round(..), как указано выше. Реализация использует BigDecimal, медленная и создает мусор. Подобный, но быстрый и не содержащий мусора метод предоставляется утилитой DoubleRounder в библиотеке decimal4j:

 double a = DoubleRounder.round(2.0/3.0, 3);
 double b = DoubleRounder.round(2.0/3.0, 3, RoundingMode.DOWN);
 double c = DoubleRounder.round(1000.0d, 17);
 double d = DoubleRounder.round(90080070060.1d, 9);
 System.out.println(a);
 System.out.println(b);
 System.out.println(c);
 System.out.println(d);

Будет выводиться

 0.667
 0.666
 1000.0
 9.00800700601E10

См. https: //github.com/tools4j/decimal4j/wiki/DoubleRounder-Utility

Отказ от ответственности: Я участвую в проекте decimal4j.

Обновление: Как отметил @iaforek, DoubleRounder иногда возвращает недопустимые результаты. Причина в том, что он выполняет математически правильное округление. Например, DoubleRounder.round(256.025d, 2) будет округлено до 256.02, потому что двойное значение, представленное как 256.025d, несколько меньше, чем рациональное значение 256.025 и, следовательно, будет округлено.

Примечания:

  • Это поведение очень похоже на конструктор конструктора BigDecimal(double) (но не на valueOf(double), который использует конструктор строк).
  • Сначала проблему можно обойти с шагом двойного округления до более высокой точности, но это сложно, и я не буду вдаваться в подробности здесь

По тем причинам и всему, что упомянуто выше в этом посте я не могу рекомендовать использовать DoubleRounder.

4
задан AnonJr 22 October 2009 в 05:24
поделиться

3 ответа

С обоими запросами похоже, что вы пытаетесь вставить в #temp. #temp находится в одной из баз данных (для аргументов sake, databaseA). Поэтому, когда вы пытаетесь вставить в #temp из databaseB, он сообщает, что он не существует.

Попробуйте изменить его с В #temp Из в В базу данныхA.dbo . # temp Из в обоих утверждениях.

Кроме того, убедитесь, что строки подключения имеют разрешения для другого БД, иначе это не сработает.

Обновление: относящееся к таблице темп выходит из области действия - если у вас есть одна строка соединения, которая имеет разрешения для обеих баз данных, тогда вы можете использовать это для обоих запросов (сохраняя соединение живым). При запросе таблицы в другой БД обязательно используйте [DBName]. [Owner]. [TableName] формат при обращении к таблице.

4
ответ дан Yaakov Ellis 22 August 2018 в 19:16
поделиться

temp находится вне области действия в q2.

Вся ваша работа может быть выполнена в одном запросе:


SELECT a.columnA, a.columnB,..., a.columnZ
FROM table2 a
INNER JOIN (SELECT databaseA..table1.column1 
            FROM databaseA..table1
            WHERE databaseA..table1.xyz = 'A') b
  ON a.columnB = b.column1
2
ответ дан Forgotten Semicolon 22 August 2018 в 19:16
поделиться

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

4
ответ дан SQLMenace 22 August 2018 в 19:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: