как использовать функцию БД, где предложение с помощью sequelize - PullRequest
0 голосов
/ 28 мая 2018

Я хочу найти среднее значение этой недели и группы по dayofweek, поэтому я пишу этот sql, sql работает хорошо, но как я могу достичь той же цели через sequelize.

select dayofweek(datetime), avg(value) from Temperatures where week(datetime) = week(now()) group by dayofweek(datetime);

А вот моя таблица Temperatures: | field | type | |----------|-------------| | uuid | char(36) | | value | float | | datetime | datetime |

Я прочитал документ sequelize, но, похоже, нет четкого объяснения того, как использовать функцию после предложения where,условие является функцией, но не полем.

Я пытался, но это не работает

where: {
  [Sequelize.Op.eq]: [
    sequelize.fn('week', Temperature.sequelize.fn('now')),
    sequelize.fn('week', Temperature.sequelize.col('datetime')),
  ]
},

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Наконец, я обнаружил, что следующий метод хорошо работает

return Temperature.findAll({
  attributes: [
    [Temperature.sequelize.fn('dayofweek', Temperature.sequelize.col('datetime')), 'dayofweek'],
    [Temperature.sequelize.fn('AVG', Temperature.sequelize.col('value')), 'value'],
  ],
  where: sequelize.where(sequelize.fn('week', Temperature.sequelize.fn('now')), sequelize.fn('week', Temperature.sequelize.col('datetime'))),
  group: sequelize.fn('dayofweek', Temperature.sequelize.col('datetime')),
});

, и если мне нужно больше условных фильтров, просто добавьте оператор [Op.and]

return Temperature.findAll({
  attributes: [
    [Temperature.sequelize.fn('dayofweek', Temperature.sequelize.col('datetime')), 'dayofweek'],
    [Temperature.sequelize.fn('AVG', Temperature.sequelize.col('value')), 'value'],
  ],
  where: {
    [Sequelize.Op.and]: [
      sequelize.where(sequelize.fn('week', Temperature.sequelize.fn('now')), sequelize.fn('week', Temperature.sequelize.col('datetime'))),
    ]
  },
  group: sequelize.fn('dayofweek', Temperature.sequelize.col('datetime')),
});

, вотsql генерируется

SELECT dayofweek(`datetime`) AS `dayofweek`, AVG(`value`) AS `value` FROM `Temperatures` AS `Temperature` WHERE (week(now())=week(`datetime`)) GROUP BY dayofweek(`datetime`);
0 голосов
/ 28 мая 2018

Вы можете использовать sequelize.fn для этого, что-то вроде этого:

[sequelize.fn('dayofweek', sequelize.col('datetime')), 'datetime']

Для более подробной информации DO READ

...