如何获取今天的Sequelize JS记录

7

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

| 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';


我更新了解决方案,这样你就不会遇到问题了。如果你认为这是解决方案,请将你的问题标记为已回答。 - Teocci
6个回答

16

问题在于你正在比较像'2019-05-27 11:40:48''2019-05-27 18:30:00'这样的时间戳。因此,如果我们将它们进行比较,永远不会得到一个true结果,即使是同一天(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”的查询,您可以在此链接中阅读更多信息。就像这样:

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

同时记得升级到最新版本

npm i sequelize@5.8.6 --s

嗨,我仍然得到SUM为0,并且在终端上执行的SQL查询没有任何变化。 - Muljayan
嘿,尝试使用小于号来查看你得到了什么,可能错误在另一个部分。 - Teocci
Op.lt 给出一个数值。但是它给出了之前所有日期的总和。 - Muljayan
那就尝试一下这个替代方案,我想我知道出了什么问题。你是在比较完全相同的时间戳吗?例如 '2019-05-27 11:40:48' 是否等于 '2019-05-27 18:30:00',这样的比较永远不会给你结果,因为它们都是同一天(5月27日),但时间不同。 - Teocci
是的,我尝试使用Op.gt并使用今天的日期并将时间更改为午夜。那很有效。 - Muljayan
检查一下为什么我使用了 gtlt,并且我已经修复了我的错误。我将 gt 替换为 lt。现在应该可以正常工作了。 - Teocci

5

获取今天的记录的最佳方法。

      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,
                        ]
                    }
                }
            });

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

1
我们还可以使用[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()]
  }
}

快乐编程...


0

使用 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);

0

您可以使用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);

0

添加DATE函数以进行日期比较,无需考虑时间。

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);

你好,"add DATE function" 是什么意思? - Muljayan
使用DATE函数,您将与日期值进行比较,并忽略hh:mm:ss值。 - Senthil
这是我应该编写的自定义函数还是Sequelize的一部分? - Muljayan
关于代码更新的注释部分,请参考内置函数sequelize.fn('date_trunc', 'day', sequelize.col('yourdatefiled'))。因此它只会考虑日期部分。 - Senthil
你不能将函数用作对象键,否则会导致错误。 SyntaxError: 意外的标记 '.' sequelize.fn('CURRENT_DATE'): { - Anthony Budd
今天还没有被使用! - Profstyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接