【问题标题】:How can I use datediff of mysql with sequelizejs如何在 sequelizejs 中使用 mysql 的 datediff
【发布时间】:2018-08-12 15:52:22
【问题描述】:

我正在尝试将此 SQL 实现到我的 Sequelize

SELECT file_id FROM table WHERE datediff(curdate(),create_date) > 5;

   Here is my Sequelize

   findOverPeriodFile: function () {
    return table.findAll({
        where:{
            60: {lt: Sequelize.fn('')}
        }
    });
}

我是 Seuelize 的新手,我曾尝试搜索 Google,但没有帮助。有人对这个问题有答案吗?我不知道在WHERE 语句中添加什么。对不起我的英语不好。

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案1】:

    给你:

    您可以使用以下命令生成WHERE datediff(curdate(),create_date) > 5;

    { 
        where: sequelize.where(sequelize.fn('datediff', sequelize.fn("NOW") , sequelize.col('create_date')), {
            $gt : 5 // OR [Op.gt] : 5
        })
    }
    

    用于添加更多条件

    {
        where: {
            $and : [
                sequelize.where(sequelize.fn('datediff', sequelize.fn("NOW") , sequelize.col('create_date')), {
                    $gt : 5 // OR [Op.gt] : 5
                }) ,
                { status : 'mystatus' }
            ]
        }
    } 
    

    【讨论】:

    • 但我尝试使用 [Op.gt] :5 并且成功了。顺便说一句,感谢您的帮助:D
    • 如何向 this 添加更多 where 子句?例如。 <DATEDIFF> AND status = 'mystatus'
    • 感谢@VivekDoshi 的快速回复:) 我正要评论我在github.com/sequelize/sequelize/issues/… 找到的解决方案之一。
    • 此外,上面的“添加更多条件”似乎给我带来了语法错误。也许$and 应该在sequelize.where 之后?
    • @NikhilNanjappa,是的,我的错误,现在检查。
    【解决方案2】:
    sequelize.where(sequelize.fn('datediff', sequelize.literal("day"), sequelize.col('Your Column date'), sequelize.fn("getdate")), {
              [Op.gt]: 0
            })
    

    【讨论】:

      【解决方案3】:
      sequelize.where(
          sequelize.fn(
              'timestampdiff', 
               sequelize.literal("minute"),
               sequelize.col('updatedAt'),
               sequelize.literal('CURRENT_TIMESTAMP')
          ), 
          {
              [Op.gte] : ACCEPTION_TIMEOUT
          }
      )
      

      如果像我这样的人正在寻找一种方法来查找 sequelize 中的日期或时间差(不仅仅是天数),timestampdiff 是一种可行的方法。

      sequelize.literal("minute") — 是一个时间单位。更多关于here

      sequelize.col('updatedAt') — 数据库中的列(日期时间)

      sequelize.literal('CURRENT_TIMESTAMP') — 为当前时间续集文字

      {
         [Op.gte] : ACCEPTION_TIMEOUT
      }
      

      这是你的时间问题的 SELECT 条件

      【讨论】:

        【解决方案4】:

        适用于 Microsoft SQL Server (MSSQL) 这个对我有用。感谢@Vivek Doshi

        let pending = await Table.findAll({
                where: {
                    [Op.and] : [
                        Sequelize.where(Sequelize.fn('datediff',  Sequelize.col('DD'), Sequelize.col('createdAt'), Sequelize.fn("GETDATE")), {
                            [Op.lt] : 1 
                        }) ,
                        { is_processed : '0' }
                    ]
                }
            } );
        

        这会生成

        SELECT * FROM [table] AS [table] 
        WHERE (datediff(DD, [createdAt], GETDATE()) < 1 AND [table].[is_processed] = 0);
        

        这正是我想要的

        【讨论】:

          【解决方案5】:
          where: {
                  [Op.and]: [
                    sequelize.where(
                      sequelize.fn(
                        "datediff",
                        sequelize.fn("NOW"),
                        sequelize.col("lastSubmitted") // your column name 
                      ),
                      {
                        [Op.gt]: 1,
                      }
                    ),
                    {status:"active"},
                  ],
          }
          
          

          请记住从 Sequelize 导入 OP,这不是默认导出。

          这应该可以工作,我之前使用过 $and$gt,但它们不起作用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-21
            • 1970-01-01
            • 2018-09-16
            相关资源
            最近更新 更多