在 NodeJS 中使用 BETWEEN 子句

Posted

技术标签:

【中文标题】在 NodeJS 中使用 BETWEEN 子句【英文标题】:Using BETWEEN Clause in NodeJS 【发布时间】:2017-12-29 06:25:19 【问题描述】:

我想使用 BETWEEN 子句从 mysql 数据库中获取数据。

在客户端,我使用 JQuery 创建了 2 个内联日历,并使用 socket.io 发出选定的 date 值;

$('#fromDate').datepicker(
    inline: true,
    altField: '#d',
    dateFormat: "dd-mm-yy",
    altFormat: "yy-mm-dd",
    monthNames: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
    dayNamesMin: ["Pa", "Pt", "Sl", "Ça", "Pe", "Cu", "Ct"],
    firstDay: 1,
    numberOfMonths: 1,
    onSelect: function(dateText, inst) 
      var dateAsString = dateText; //the first parameter of this function
      var dateAsObject = $(this).datepicker('getDate'); //the getDate method
      console.log(dateAsString);
      socket.emit('socketfromDate', $('#d').val());
    
  );

  $('#toDate').datepicker(
    inline: true,
    altField: '#x',
    dateFormat: "dd-mm-yy", 
    altFormat: "yy-mm-dd", 
    monthNames: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
    dayNamesMin: ["Pa", "Pt", "Sl", "Ça", "Pe", "Cu", "Ct"],
    firstDay: 1,
    numberOfMonths: 1,
    onSelect: function(dateText, inst) 
      var dateAsString = dateText; //the first parameter of this function
      var dateAsObject = $(this).datepicker('getDate'); //the getDate method
      console.log(dateAsString);
      socket.emit('sockettoDate', $('#x').val());
    
  );

在服务器端,如果我在 'fromDate' 值之后收到 'toDate' 值,MySql 查询必须在这几天之间获取数据。

 var  fromDate_query,
      toDate_query;

io.on('connection', function(socket) 

      socket.on('socketfromDate', function(fromDate) 
        console.log();
        console.log("----------------------------------");
        console.log("Selected dateTime 'from': " + fromDate); //output: Selected dateTime 'from': 2017-07-01 
        console.log("----------------------------------");
        console.log();
        fromDate_query = fromDate;
      );

      socket.on('sockettoDate', function(toDate) 
        console.log();
        console.log("----------------------------------");
        console.log("Selected dateTime 'to': " + toDate); //output: Selected dateTime 'to': 2017-07-13
        console.log("----------------------------------");
        console.log();
        toDate_query = toDate;

        connection.query("SELECT * FROM report WHERE date BETWEEN ? AND  ?", [fromDate_query, toDate_query], function(err, rows) 
          if (err) console.log(err);
          else 
            for (var i = 0; i < rows.length; i++) 
              var row = rows[i];
              console.log("**********************************");
              console.log("Possible machine: " + row.machine); //output: nothing
              console.log("**********************************");
            
          
        );
      );
    );

问题是,什么都没有发生。

两天之间查询的最佳方法是什么?

【问题讨论】:

【参考方案1】:

您的代码存在三个问题:

    使用两个事件分别发送 to 和 from 日期,而您需要两个数据来处理 SQL 查询。

    既然可以使用套接字,为什么还要使用 / 最好将 http 请求用于事务性内容。

    查询应在事件内部完成,因为当您从客户端发出数据时,数据将出现在该事件中。

回答你的问题。您将不得不重构您的代码以将两个单独的事件删除为一个事件,该事件将接收您的日期和日期,如下所示:

   socket.on('dates', function(dateData) 

        var toDate_query = dateData.toDate;
        var fromDate_query = dateData.fromDate;
        connection.query("SELECT * FROM report WHERE date BETWEEN ? AND  ?", [fromDate_query, toDate_query], function(err, rows) 
          if (err) console.log(err);
          else 
            for (var i = 0; i < rows.length; i++) 
              var row = rows[i];
              console.log("**********************************");
              console.log("Possible machine: " + row.machine); //output: nothing
              console.log("**********************************");
            
          
        );

除此之外,您必须重构前端以仅在两个日期都被选中时才发出事件。

编辑: BONUS POINT -> 收到查询数据后请释放SQL连接

【讨论】:

我无法重构我的客户端,但是当我尝试时,我发现了问题所在;我选择的日期没有记录,这就是为什么它什么也没显示。 :) 而且我不想刷新页面,这就是我使用 socket.io 的原因。感谢您的宝贵时间。 @erayaras 即使它确实有任何记录,您的代码也不会按预期工作。请仔细查看我上面列出的要点,并可能阅读 socket.io 事件侦听器和事件侦听器内的对象范围。

以上是关于在 NodeJS 中使用 BETWEEN 子句的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Between(范围)子句

Oracle Between(范围)子句

Oracle Between子句

在 ROWS BETWEEN 子句的存储过程中使用变量

在数据库中获取日期时出错(BETWEEN 子句| VB.NET|OLE)

如何在同一SQL查询中合并子句LIKE和BETWEEN?