mysql - вычислить разницу между двумя датами - PullRequest
0 голосов
/ 02 марта 2019

У меня есть таблица, которая выглядит следующим образом.

CREATE TABLE `table_growth` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `timestamp` datetime DEFAULT CURRENT_TIMESTAMP,
  `table_name` varchar(50) DEFAULT NULL,
  `rows` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8

Пример строк в таблице:

+-----+---------------------+--------------------------+-------+
| id  | timestamp           | table_name               | rows  |
+-----+---------------------+--------------------------+-------+
| 110 | 2019-03-01 06:00:00 | attachments              |   640 |
| 111 | 2019-03-01 06:00:00 | contacts                 |     0 |
| 112 | 2019-03-01 06:00:00 | copy_menuitem_options    |  3038 |
| 113 | 2019-03-01 06:00:00 | copy_menuitem_suboptions |  9779 |
| 114 | 2019-03-01 06:00:00 | copy_menuitems           | 12118 |
| 115 | 2019-03-02 06:00:00 | attachments              |   638 |
| 116 | 2019-03-02 06:00:00 | contacts                 |     0 |
| 117 | 2019-03-02 06:00:00 | copy_menuitem_options    |  3039 |
| 118 | 2019-03-02 06:00:00 | copy_menuitem_suboptions |  9789 |
| 119 | 2019-03-02 06:00:00 | copy_menuitems           | 12128 |
+-----+---------------------+--------------------------+-------+

Я хочу вычислить diff(rows) между 2 днями.как date(timestamp)='2019-03-02' - date(timestamp)='2019-03-01'

Ожидаемые результаты

table_name              | Rows Diff
------------------------------
attachments             | 2
contacts                | 0           
copy_menuitem_options   | 1
copy_menuitem_suboptions| 10 
copy_menuitems          | 10 

Я пытался эти запросы, но где-то не получалось.

 SELECT x.table_name
     , (y.rows-x.rows)as diff
  FROM dbadmin.table_growth x
  JOIN dbadmin.table_growth y
    ON y.id = x.id
   AND DATE(y.timestamp) = '2019-03-02' 
 WHERE DATE(x.timestamp) = '2019-03-01';

select x.table_name, (y.rows - x.rows) as doff
from table_growth x join
table_growth y on y.id=x.id and DATE(y.timestamp) = '2019-03-02' 
WHERE DATE(x.timestamp) = '2019-03-01';

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

это будет работать;

select distinct a.table_name,(a.rows-b.rows) diff from table_growth a,table_growth b 
where a.table_name=b.table_name;
0 голосов
/ 02 марта 2019

Если у вас есть только одна строка на дату, то это может быть самый быстрый подход:

SELECT g.table_name,
       SUM(CASE WHEN DATE(g.timestamp) = '2019-03-02'
                THEN g.rows 
                WHEN DATE(g.timestamp) = '2019-03-01'
                THEN -g.rows
                ELSE 0
           END) as diff
FROM dbadmin.table_growth g
WHERE g.timestamp >= '2019-03-01' AND
      g.timestamp < '2019-03-03'
GROUP BY g.table_name;

В частности, это может использовать индекс для table_growth(timestamp, table_name, rows).

0 голосов
/ 02 марта 2019

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

SELECT
    x.table_name,
    (x.rows - y.rows) AS diff
FROM table_growth x
INNER JOIN table_growth y
    ON x.table_name = y.table_name and
       DATE(y.timestamp) = '2019-03-02'
WHERE
    DATE(x.timestamp) = '2019-03-01';

Примечание: ваш текущий вывод немного неоднозначен, потому что не ясно, какое значение rows стоит первым в разнице, или есливозможно, вы хотите сообщить абсолютное значение.

...