У меня есть хранимая процедура, которая дает мне ожидаемый результат, когда я запускаю ее в MySQL 5. Но когда я попытался выполнить ту же процедуру на MariaDB 10.1.22, это дает мне другой результат.
Вот моя хранимая процедура -
DELIMITER ;;
CREATE DEFINER='mconnect_admin'@'%' PROCEDURE 'TestCumulative'(IN
start_date TIMESTAMP,IN end_date TIMESTAMP,IN duration TEXT,IN
mno_id TEXT,IN profile_type TEXT,IN timezone TEXT)
BEGIN
SET @provisioned = 0;
SET @downloaded = 0;
SET @excludeProfileFilter = FALSE;
SET @hourlyReport = FALSE;
SET @monthlyReport = FALSE;
SET @sdate = start_date;
DROP TABLE IF EXISTS tempDates;
CREATE TEMPORARY TABLE IF NOT EXISTS tempDates(timeRange
VARCHAR(50));
DELETE FROM tempDates;
IF(profile_type = '')
THEN
SET profile_type = null;
SET @excludeProfileFilter = TRUE;
END IF;
IF (duration = 'lastDay')
THEN
SET @hourlyReport=true;
END IF;
IF (duration = 'lastYear')
THEN
SET @monthlyReport = TRUE;
END IF;
WHILE @sdate <= end_date DO
IF (@hourlyReport = TRUE)
THEN
INSERT INTO tempDates (timeRange) VALUES (HOUR(@sdate) + 1);
SET @sdate = date_add(@sdate, INTERVAL 1 HOUR);
ELSE IF(@monthlyReport = TRUE)
THEN
INSERT INTO tempDates (timeRange) VALUES (MONTH(@sdate));
SET @sdate = date_add(@sdate, INTERVAL 1 MONTH);
ELSE
INSERT INTO tempDates (timeRange) VALUES (DATE(@sdate));
SET @sdate = date_add(@sdate, INTERVAL 1 DAY);
END IF;
END IF;
END WHILE ;
SELECT CASE WHEN r.DateRange IS NULL THEN (@provisioned :=
@provisioned) ELSE (@provisioned := @provisioned + r.Provisioned)
END AS Provisioned,
CASE WHEN r.DateRange IS NULL THEN (@downloaded := @downloaded) ELSE
(@downloaded := @downloaded + r.Downloaded) END AS Downloaded,
CASE WHEN r.DateRange IS NULL THEN d.timeRange ELSE r.DateRange END
AS DateRange FROM (
SELECT sum(result.Provisioned) as Provisioned,
sum(result.Downloaded) AS Downloaded, result.DateRange FROM (
SELECT
1 As Provisioned,
0 AS Downloaded,
CASE WHEN @hourlyReport=TRUE
THEN HOUR(CONVERT_TZ(s.provisioning_date,"+00:00",timezone))
WHEN @monthlyReport=TRUE
THEN MONTH(CONVERT_TZ(s.provisioning_date,"+00:00",timezone))
ELSE DATE(CONVERT_TZ(s.provisioning_date,"+00:00",timezone))
END
AS DateRange
FROM subscription s
INNER JOIN profile_type p ON p.id = s.profile_type
WHERE s.mno_id = mno_id
AND (@excludeProfileFilter=true or p.display_name=profile_type OR p.subscription_type=profile_type)
AND DATE(CONVERT_TZ(s.provisioning_date,"+00:00",timezone)) BETWEEN DATE(CONVERT_TZ(start_date,"+00:00",timezone)) AND DATE(CONVERT_TZ(end_date,"+00:00",timezone))
UNION ALL
SELECT
0 As Provisioned,
1 As Downloaded,
CASE WHEN @hourlyReport=TRUE
THEN COALESCE(HOUR(CONVERT_TZ(r.end_download_date,"+00:00",timezone)),HOUR(CONVERT_TZ(r.last_update,"+00:00",timezone)))
WHEN @monthlyReport=TRUE
THEN COALESCE(MONTH(CONVERT_TZ(r.end_download_date,"+00:00",timezone)),MONTH(CONVERT_TZ(r.last_update,"+00:00",timezone)))
ELSE COALESCE(DATE(CONVERT_TZ(r.end_download_date,"+00:00",timezone)),DATE(CONVERT_TZ(r.last_update,"+00:00",timezone)))
END
AS DateRange
FROM subscription s
INNER JOIN profile_type p ON p.id = s.profile_type
LEFT JOIN rsp_session r ON r.profile_iccid = s.iccid
WHERE s.mno_id = mno_id
AND (@excludeProfileFilter=TRUE OR p.display_name=profile_type OR p.subscription_type=profile_type)
AND COALESCE(DATE(CONVERT_TZ(r.end_download_date,"+00:00",timezone)),DATE(CONVERT_TZ(r.last_update,"+00:00",timezone))) BETWEEN DATE(CONVERT_TZ(start_date,"+00:00",timezone)) AND DATE(CONVERT_TZ(end_date,"+00:00",timezone)) AND s.status IN('INSTALLED','ENABLED','DELETED')
) result GROUP BY result.DateRange
) r RIGHT OUTER JOIN tempDates d ON r.DateRange = d.timeRange;
END;;
DELIMITER ;
Результат, который я получаю в MaroiaDB 10.1.22, что неверно -
2 0 2017-11-02
5 10 2017-11-03
32 16 2017-11-06
51 34 2017-11-07
64 42 2017-11-08
79 47 2017-11-09
79 48 2017-11-10
102 61 2017-11-13
116 61 2017-11-14
128 68 2017-11-15
145 71 2017-11-16
157 82 2017-11-17
196 95 2017-11-20
254 111 2017-11-21
273 118 2017-11-22
313 134 2017-11-23
323 144 2017-11-24
363 149 2017-11-27
368 152 2017-11-28
371 152 2017-11-29
403 160 2017-11-30
403 160 2017-11-01
403 160 2017-11-04
403 160 2017-11-05
403 160 2017-11-11
403 160 2017-11-12
403 160 2017-11-18
403 160 2017-11-19
403 160 2017-11-25
403 160 2017-11-26
Это должно быть в порядке.
Может ли кто-нибудь сказать, что случилось? Или его проблема с БД?
Заранее спасибо.
У вас нет order by
в любом из ваших запросов. Набор результатов может быть в любом порядке, потому что наборы результатов без order by
(например, таблицы) являются неупорядоченными наборами.
Следовательно, база данных правильная. В вашем понимании отсутствует этот важный факт о SQL.
Добавьте order by
который вы хотите, и набор результатов будет соответствующим образом упорядочен в любой используемой вами версии базы данных.