Переменные в SQL-выражении приводят к зависанию запроса - PullRequest
0 голосов
/ 24 ноября 2018

следующий оператор sql выдает то, что должен.Минимальное значение в определенный период времени.

select value, datetime from Schuppen 
where (value = (select min(value) from Schuppen 
    where (measure = 'temp') 
    and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00')) 
and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00';

Когда вместо жестко закодированных дат я использую переменную, оператор зависает.

set @startdate = cast('2018-11-01 00:00:00' as datetime);   
select value, datetime from Schuppen 
where (value = (select min(value) from Schuppen 
    where (measure = 'temp') 
    and datetime between @startdate and '2018-11-02 00:00:00')) 
and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00';

Интересно, почему этот оператор не работаетпротив моей версии maria db 10.1.26-MariaDB-0 + deb9u1.

Пробовал через консоль mysql.

mysql --user=XXXX --password=XXXX Outdoor-Air
...
Your MariaDB connection id is 194
Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1

...

MariaDB [Outdoor-Air]> set @startdate = cast('2018-11-01 00:00:00' as datetime);
Query OK, 0 rows affected (0.00 sec)
MariaDB [Outdoor-Air]> select @startdate;
+---------------------+
| @startdate          |
+---------------------+
| 2018-11-01 00:00:00 |
+---------------------+
1 row in set (0.01 sec)

MariaDB [Outdoor-Air]> select value, datetime from Schuppen where (value = (select min(value) from Schuppen where (measure = 'temp') and datetime between @startdate and '2018-11-02 00:00:00')) and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00';

Теперь оператор зависает.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018
SELECT  `value`, `datetime`
    FROM  Schuppen
    WHERE  measure = 'temp'
      AND  `datetime` >= '2018-11-01'
      AND  `datetime` <  '2018-11-01' + INTERVAL 1 DAY
    ORDER BY `value`  ASC
    LIMIT  1;

И это должно помочь:

INDEX(measure, datetime, value)

Одна потенциальная разница между этой формулировкой и вашей: Эта строка будет отображать только одну строку, если наименьшее значение встречается более одного раза в этот день.

0 голосов
/ 24 ноября 2018

Убедитесь, что оба запроса, , а именно: , SET и SELECT, выполняются в одном сеансе.@startdate будет сохраняться только в течение одного сеанса.

Вы также можете преобразовать эти два запроса в один запрос, используя CROSS JOIN с производной таблицей.

SELECT value,
       `datetime`
FROM   Schuppen
CROSS JOIN (SELECT @startdate := cast('2018-11-01 00:00:00' as datetime)) vars 
WHERE  ( value = (SELECT Min(value)
                  FROM   Schuppen
                  WHERE  ( measure = 'temp' )
                         AND `datetime` BETWEEN
                             @startdate AND '2018-11-02 00:00:00') )
       AND `datetime` BETWEEN '2018-11-01 00:00:00' AND '2018-11-02 00:00:00';  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...