Последовательность вычитания updatedAt и createdAt после преобразования в секунды

Эй, я действительно новичок в SEQUELIZE, и для этого проекта я пытаюсь вычесть значения updatedAt и createdAt после их преобразования в секунды.

Столбец Updated и createdAt имеет формат DATETIME. Одна из строк состоит из значения createdAt как 2021-03-03 21:30:58 и updatedAt как 2021-03-03 22:42:05. Есть ли способ сначала преобразовать это значение в секунды, а затем вычесть его. Я попробовал это ниже, но он не форматируется в секунды, а timePlayed всегда отображает результат как 14000.

Может ли кто-нибудь сообщить мне, что я должен делать при продолжении, чтобы отформатировать дату в секундах, а затем вычесть значение между createdAt и updatedAt?

router.get(
    "/sessions/average_team_time",
    (req, res) => {
      models.Session.findAll({
        createdAt: sequelize.literal('createdAt * 100000'),
        updatedAt: sequelize.literal('updatedAt * 100000')
        'attributes': [
              'id',
              'createdAt',
              'updatedAt',
              [Sequelize.fn('time', Sequelize.col('updatedAt')), 'updatedAtHour'],
              [Sequelize.fn('date_format', Sequelize.col('createdAt'), '%Y-%m-%d %H:%m:%S'), 'date_formed'],
              [Sequelize.literal('(updatedAt - createdAt)'), 'timePlayed']
         ]
      })
        .then((sessions) => {
          res.json(sessions);
        })
        .catch((err) => res.json(err));
    }
  ); 

person Yahoo    schedule 04.03.2021    source источник
comment
Какую БД вы используете? Вы искали функции даты БД, которые могут дать вам разницу между двумя значениями даты и времени?   -  person Anatoly    schedule 04.03.2021
comment
@ Анатолий Я использую базу данных MySQL.   -  person Yahoo    schedule 05.03.2021
comment
Функция TIMESTAMPDIFF доступна в mysql   -  person MERN    schedule 05.03.2021


Ответы (1)


db.Session.findAll({
    attributes: [
        'id',
        'createdAt',
        'updatedAt',
        [Sequelize.fn('TIMESTAMPDIFF', Sequelize.literal('SECOND'), Sequelize.col("createdAt"), Sequelize.col("updatedAt")), 'timePlayed']

    ]
})
    .then(resp => res.send(resp))
    .catch(error => res.send({ status: false, error: error }))

Иногда javascript мощнее, чем сиквел

db.Session.findAll({
    // createdAt: sequelize.literal('createdAt * 100000'),
    // updatedAt: sequelize.literal('updatedAt * 100000'),
    attributes: [
        'id',
        'createdAt',
        'updatedAt',
        [Sequelize.fn('time', Sequelize.col('updatedAt')), 'updatedAtHour'],
        [Sequelize.fn('date_format', Sequelize.col('createdAt'), '%Y-%m-%d %H:%m:%S'), 'date_formed'],
        // [Sequelize.literal('(updatedAt - createdAt)'), 'timePlayed']
    ]
})
    .then((sessions) => {
        sessions = JSON.parse(JSON.stringify(sessions))
        sessions = sessions || []
        sessions = sessions.map(item => {
            item.timePlayed = new Date(item.updatedAt).getTime() - new Date(item.createdAt).getTime()
            return item;
        })
        res.json(sessions);
    })
    .catch((err) => res.json(err));

Или мы можем использовать DataTypes.VIRTUAL

модель: определить

Session.init({
    timePlayed: {
        type: DataTypes.VIRTUAL,
        get() {
            return new Date(this.updatedAt).getTime() - new Date(this.createdAt).getTime()
        }
    }
})

...

db.Session.findAll({
    attributes: ['id', 'createdAt', 'updatedAt', 'timePlayed']
})
    .then(resp => res.send(resp))
    .catch(error => res.send({ status: false, error: error }))
person MERN    schedule 05.03.2021