【问题标题】:How to fetch sequelize js records for today如何获取今天的 sequelize js 记录
【发布时间】:2019-05-28 10:26:51
【问题描述】:

我有一张类似于下表的表格。我正在尝试找出今天所有价格的总和。

| id| price |       created        |
|---|-------|----------------------|
| 0 |  500  | 2018-04-02 11:40:48  |
| 1 | 2000  | 2018-04-02 11:40:48  |
| 2 | 4000  | 2018-07-02 11:40:48  |

下面的代码是我想出的,但它似乎不起作用。

const TODAY = new Date();
const SUM = await OrdersModel.sum('price', {
    where: {
      created: TODAY,
    },
});
console.log(SUM);

即使有今天的条目,SUM 的值也为 0。我也尝试了以下方法,但也没有用。

const TODAY = new Date();
const SUM = await OrdersModel.sum('price', {
    where: {
      created: Sequelize.DATE(TODAY),
    },
});
console.log(SUM);

终端查询的SQL语句如下。

执行(默认):SELECT sum(`price`) AS `sum` FROM `orders` AS `orders` WHERE `orders`.`created` = '2019-05-27 18:30:00';

【问题讨论】:

  • 我更新了解决方案,因此您不会有任何问题,如果您认为这是解决方案,请将您的问题标记为已回答。

标签: mysql node.js express sequelize.js


【解决方案1】:

这里发生的是您正在比较精确的时间戳,例如 '2019-05-27 11:40:48' 等于 '2019-05-27 18:30:00'。所以这种比较永远不会给你一个结果,因为即使是同一天(5 月 27 日)但时间不同。

所以在这里你有一个可能的解决方案。

const Op = Sequelize.Op;
const TODAY_START = new Date().setHours(0, 0, 0, 0);
const NOW = new Date();

const SUM = await OrdersModel.sum('price', {
    where: {
      created: { 
        [Op.gt]: TODAY_START,
        [Op.lt]: NOW
      },
    },
 });
 console.log(SUM);

您需要创建这样的查询:created < [NOW] AND created > [TODAY_START]为什么?因为您将获得在NOW 之后注册的所有价格的总和。此代码还将帮助您获取日期范围的总数。

PostgreSQL 的替代方案

请注意,PostgreSQL 允许您截断到特定的时间间隔。因此,您可以调用sequelize.fn() 方法来创建一个调用“date_trunc”的查询,您可以read more in this link。像这样:

const SUM = await OrdersModel.sum('price', {
    where: {
      sequelize.fn('CURRENT_DATE'): {
        [Op.eq]:  sequelize.fn('date_trunc', 'day', sequelize.col('created'))
      }
    },
});
console.log(SUM);

另外记得更新到latest version:

npm i sequelize@5.8.6 --s

【讨论】:

  • 嗨,我仍然得到 SUM 为 0,终端上执行的 SQL 查询没有变化。
  • 嘿试试小于看看你得到什么错误可能在另一部分
  • Op.lt 给出一个值。它如何给出所有先前日期的总和。
  • 然后试试这个替代方案,我想我知道发生了什么。你在比较确切的时间戳吗?比如'2019-05-27 11:40:48'等于'2019-05-27 18:30:00'这个比较永远不会给你结果,因为它是同一天(5月27日)但时间不同。
  • 是的,所以我尝试使用 Op.gt 并使用今天日期并将时间更改为午夜。这行得通。
【解决方案2】:

使用moment会更容易

const moment = require('moment');
const Op = require('sequelize').Op;
const SUM = await OrdersModel.sum('price', {
    where : {
                created_at : { [Op.gt] : moment().format('YYYY-MM-DD 00:00')},
                created_at : { [Op.lte] : moment().format('YYYY-MM-DD 23:59')}
            },
});
console.log(SUM);

【讨论】:

    【解决方案3】:

    添加 DATE FUNCTION 进行日期比较而不考虑时间

    const TODAY = new Date();
    const SUM = await OrdersModel.sum('price', {
        where: {
          sequelize.fn('CURRENT_DATE'): {$eq:  sequelize.fn('date_trunc', 'day', sequelize.col('created'))}
        },
    });
    console.log(SUM);
    

    【讨论】:

    • 嗨,添加 DATE 函数是什么意思?
    • 使用 DATE 函数,您将与日期值进行比较,它将忽略 hh:mm:ss 值
    • 它是我应该编写的自定义函数还是续集的一部分?
    • 参考评论部分的更新代码,它是一个内置函数 sequelize.fn('date_trunc', 'day', sequelize.col('yourdatefiled')) 。所以它只会考虑日期部分
    • 您不能使用对象键的函数,这将导致错误。 SyntaxError:意外的标记“。” sequelize.fn('CURRENT_DATE'): {
    【解决方案4】:

    我们还可以使用 [op.between],它将获取两个给定日期范围之间的数据。因此,如果我们给出今天的开始时间和当前时间,它将给出今天的数据。

    const Op = Sequelize.Op;
    const START = new Date();
    START.setHours(0, 0, 0, 0);
    const NOW = new Date();
    
    where: {
    createdAt: {
        [Op.between]: [START.toISOString(), NOW.toISOString()]
      }
    }
    

    快乐编码...

    【讨论】:

      【解决方案5】:

      你可以使用Sequelize.literal:

          const { Op } = Sequelize;
          const options = {
              where: {}
          };
      
          options[Op.and] = [
              sequelize.where(Sequelize.literal('DATE(created) = CURDATE()'))            
          ] 
      
          const SUM = await OrdersModel.sum('price', options);
          console.log(SUM);
      

      如果没有未来日期,您可以如下查询,

          options[Op.and] = [
              sequelize.where(sequelize.col('created'), {
                  [Op.gt]: Sequelize.literal('DATE_SUB(CURDATE(), INTERVAL 1 DAY)')
              })            
          ]
          const SUM = await OrdersModel.sum('price', options);
          console.log(SUM);
      

      【讨论】:

        【解决方案6】:

        获取今日记录的最佳方式。

              const op = sequelize.Op;
              const moment = require('moment');
              const TODAY_START = moment().format('YYYY-MM-DD 00:00');
              const NOW = moment().format('YYYY-MM-DD 23:59');
        
              const todaysRecord = await OrdersModel.findAll({
        
                        where: {
                            createdAt: {
                                [op.between]: [
                                    TODAY_START,
                                    NOW,
                                ]
                            }
                        }
                    });
        

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 2014-02-07
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        相关资源
        最近更新 更多