#php #sql-server #sqlsrv
#php #sql-сервер #sqlsrv
Вопрос:
У меня есть SQL-запрос (к базе данных MSSQL), который выглядит следующим образом:
$sql_timekort = "SELECT
status,
timematrise.ansatt,
SUM(normaltimer) AS normaltimer,
SUM(overtid_1) AS overtid_1,
SUM(overtid_2) AS overtid_2,
SUM(kilometer) AS kilometer,
COUNT(diett) AS diett,
COUNT(CASE WHEN diett = 'ja' THEN 1 ELSE NULL END) AS diett
FROM timematrise
WHERE status = '6'
AND dato LIKE '2019-02%'
GROUP BY ansatt, status";
Который запускается sqlsrv в PHP следующим образом:
$stmt = sqlsrv_query($timeregistrering_tilkobling, $sql_timekort); if( $stmt === false) { die( print_r( sqlsrv_errors(), true) ); }
Результат этого запроса выглядит следующим образом в SQL Management Studio:
Этот результат соответствует ожиданиям, и SQL-запрос, похоже, работает нормально. Но когда я выполняю sqlsrv_fetch_array вот так:
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
Это результат:
Array
(
[status] => 6
[ansatt] => 270
[normaltimer] => .00
[overtid_1] => .00
[overtid_2] => .00
[kilometer] => 0
[diett] => 0
)
И вот тут я в замешательстве. Где числа? Каждое число равно либо 0,00, либо 0.
Таблица определяется следующим образом:
status: int
ansatt: int
normaltimer: decimal(18, 2)
overtid_1: decimal(18, 2)
overtid_2: decimal(18, 2)
kilometer: decimal(18, 0)
diett: varchar(50)
Любая помощь приветствуется!
Комментарии:
1. Проверьте эту ссылку: learn.microsoft.com/en-us/sql/connect/php/… . Это может зависеть от вашей версии PHP или версии SQL Server.
Ответ №1:
Я не могу воспроизвести вашу ошибку, потому что в среде Windows (драйвер PHP для SQL Server 4.0.3, SQL Server 2012) все значения из decimal
столбцов возвращаются правильно. Но в Linux об этом сообщается о проблеме. Сообщаемые проблемы заключаются в следующем: 1) Денежные поля возвращают 4 цифры после точки и 2) Десятичные поля не возвращают 0 в начале.
Начиная с версии 5.6 драйвера PHP для SQL Server, вы можете использовать опцию FormatDecimals на уровнях подключения и инструкции для обоих драйверов для форматирования десятичных значений в полученных результатах. Итак, это будет очевидным решением.
Комментарии:
1. Это действительно работает! С параметром FormatDecimals при подключении работает каждый результат. Спасибо!