我有一个存储过程,当我在 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
,结果集将在您使用的任何版本的数据库中进行适当的排序。
关于mysql - 相同的存储过程,相同的表,不同的数据库给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48853629/