Обработка строк в MySQL - вычислить дни с даты - PullRequest
0 голосов
/ 17 марта 2020

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

table
---------------------------------------
id        last_update
---------------------------------------
1         2020-02-22T00:32:04.254975Z
2         2020-02-22T02:09:27.057131Z
3         2020-02-22T01:38:48.739303Z
4         2020-02-21T06:19:17.832257Z
5         2020-02-14T03:10:02.551126Z
6         2020-02-21T23:17:01.907037Z

id - это INT, а last_update - это VARCHAR (поскольку формат не поддерживается как тип DATE TIME в MySQL).

Что я хочу сделать, это создать новый столбец с именем days_since_last_update, который вычисляет количество дней между сегодняшней датой и датой last_updated.

Как это можно сделать в запросе MySQL ?

Спасибо, х

1 Ответ

2 голосов
/ 17 марта 2020

Вы должны хранить свои метки времени в правильном столбце даты и времени. При этом мы можем попытаться обойти текстовые даты, используя STR_TO_DATE. Я бы на самом деле предложил не добавлять новый столбец, так как ваш запрос только для производных данных. Вместо этого сгенерируйте этот столбец при запросе:

SELECT
    id,
    last_update,
    DATEDIFF(STR_TO_DATE(last_update, '%Y-%m-%dT%H:%i:%s'),
             (SELECT STR_TO_DATE(t2.last_update, '%Y-%m-%dT%H:%i:%s')
              FROM yourTable t2
              WHERE t2.id < t1.id ORDER BY t2.id DESC)) AS days_since_last_update
FROM yourTable t1
ORDER BY t1.id;

Первые дни с момента последнего обновления будут иметь значение NULL, так как для таблицы не было записано более раннее обновление. Хотя, если вам нужно значение по умолчанию, это можно легко включить.

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

SELECT
    id,
    last_update,
    DATEDIFF(CURDATE(),
             STR_TO_DATE(last_update, '%Y-%m-%dT%H:%i:%s')) AS days_since_last_update
FROM yourTable
ORDER BY id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...