Одна и та же хранимая процедура, одни и те же таблицы, разные БД дают разные результаты

0

У меня есть хранимая процедура, которая дает мне ожидаемый результат, когда я запускаю ее в 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

Это должно быть в порядке.

Может ли кто-нибудь сказать, что случилось? Или его проблема с БД?

Заранее спасибо.

  • 0
    Что вы подразумеваете под "MySQL 10"? Это не действительный выпуск MySQL
Теги:

1 ответ

1

У вас нет order by в любом из ваших запросов. Набор результатов может быть в любом порядке, потому что наборы результатов без order by (например, таблицы) являются неупорядоченными наборами.

Следовательно, база данных правильная. В вашем понимании отсутствует этот важный факт о SQL.

Добавьте order by который вы хотите, и набор результатов будет соответствующим образом упорядочен в любой используемой вами версии базы данных.

  • 0
    Привет, спасибо за ответ. Мне нужно вызвать процедуру для разных длительностей, таких как lastMonth, lastYear, lastDay. Если я использую заказ By в этом - для lastDay, я получу такой результат - 1 10 11 12 14 15 16 17 18 19 2 20 21 22 23 24 3 4 5 6 7 8 9

Ещё вопросы

Сообщество Overcoder
Наверх
Меню