将选定日期与表列或 MySQL 查询生成的日期数组进行比较

Posted

技术标签:

【中文标题】将选定日期与表列或 MySQL 查询生成的日期数组进行比较【英文标题】:Compare a selected date against a table column or an array of dates produced from MySQL query 【发布时间】:2021-04-18 01:11:51 【问题描述】:

我有一个如下所示的页面:

我要做的是将“假日日期:”选择与其下方表格中的“日期”列中的行值进行比较。我试过使用这样的代码:

function dateChk()
        var dt1 = document.getElementById('PHDate').value;
        var dt2 = document.getElementById('phdateadd').value;
            if (dt1 == dt2) 
               alert("This date already assigned, please try again.");
               document.getElementById('phdateadd').value = 0;
         
 

但这仅适用于第一行。然后我想到了像这样的数组:

<input id="phdateadd" name="phdateadd" type="date" onchange="myFunction()" required>

<p id="demo"></p>

<script>
var dates= ["2021-01-01", "2021-02-12", "2021-02-13", "2021-04-02", "2021-05-01", 
                        "2021-05-13", "2021-05-14", "2021-05-26", "2021-05-30", "2021-05-31", 
                        "2021-07-06", "2021-07-20", "2021-08-10", "2021-08-31", "2021-09-16", 
                        "2021-10-02", "2021-10-19", "2021-11-04", "2021-12-25"];

function checkDate(date) 
  return date == document.getElementById("phdateadd").value;


function myFunction() 
  document.getElementById("demo").innerhtml = dates.find(checkDate);
  var chk = document.getElementById("demo").innerHTML;
  
  if ( chk != "undefined" ) 
        alert("This date already assigned, please try again.");
        document.getElementById("phdateadd").value = 0;

</script>

这确实有效,但是我必须将该列中的所有日期指定为数组。我有这样的想法,即从 mysql 查询中传递数据,其日期值的格式类似于数组,但它似乎无法识别。这是查询:

SELECT CONCAT('["',GROUP_CONCAT(phdate SEPARATOR '", "'),'"]') As arrdate FROM table1;

which returns

["2021-01-01", "2021-02-12", "2021-02-13", "2021-04-02", "2021-05-01", "2021-05-13", "2021-05-14",
 "2021-05-26", "2021-05-30", "2021-05-31", "2021-07-06", "2021-07-20", "2021-08-10", "2021-08-31",
 "2021-09-16", "2021-10-02", "2021-10-19", "2021-11-04", "2021-12-25"]

所以,我将结果显示在页面中:

<% phDates.forEach((phDates, index) =>  %>
        <tr><td><p id="phdates" name="phdates" value="<%= phDates.arrdate %>"><%= phDates.arrdate %>
            <% ) %></p><p id="demo" name="demo">b</p><br><p id="demo1" name="demo1">a</p></td></tr>

<script>
var dates = document.getElementById("phdates").innerHTML;
        document.getElementById("demo").innerHTML = dates;
</script>

您可以看到来自 MySQL 查询的 arrdate 值和 demo 显示类似的格式。当我在var dates 中指定数组时,demo 的值是不同的(就像在我上面的 sn-p 中一样):

如果我故意让 MySQL 返回数据,尽管它仍然无法识别它。我认为如果这种方法可行,我什至不需要将所选日期与表中的列进行比较。我使用$( "div" ).toArray() 进行了测试,但我也无法让它工作。

我认为这对我来说可能是直接的解决方案,但我想知道如何格式化 MySQL 结果值以与正确的 javascript 数组格式相对应?或者保持 MySQL 输出不变并将该值转换为 javascript 数组兼容值。我不禁想到解决方案可能很简单,但我一直在寻找几天,但我没有找到任何解决方案。

【问题讨论】:

你的 sn-p 工作得很好...... 是的@AntonyJack,但如果我指定(硬编码)数组。我想使用 MySQL 查询结果中的日期数据列表。简而言之,我只想要一个动态的值数组,而不是对其进行硬编码。 &lt;%...%&gt; 标签是怎么回事?您使用的是 ASP 或 php,还是其他一些服务器端语言?看起来您输出日期的循环正在生成多个带有id="phdates"&lt;p&gt; 标签,这是非法的HTML(ids 必须是唯一的)。 @kmoser 更新了标签。我没有包含 node.jsejs (&lt;%...%&gt;) 标签,因为我认为我的问题是关于“如何从 MySQL 查询输出到 html 并被识别为 javascript 数组”。对于那个很抱歉。我的工作代码与 sn-p 中的完全一样。其他只是我所做的额外测试,我的代码中没有任何 &lt;p&gt;(或其他)标签与重复的 id 由于您已经获取数据并显示到您的表格中,因此无需以数组的形式再次获取它们。您在循环中使用静态元素 ID,这很糟糕;用类名更改这些 ID。为了让您的dateChk 工作,您需要将PHDate 元素的ID 替换为类,然后在dateChk 中查询所有PHDate 类元素(使用document.querySelectorAll('.PHDate')) 并比较每个日期,直到找到匹配项或循环结束。 【参考方案1】:

实际上有一个直接的解决方案。让我们从您的查询开始我们的思考过程,这离解决方案不是很远(这还不是很好,但已经足够接近我们的思考过程了):

SELECT CONCAT('["',GROUP_CONCAT(phdate SEPARATOR '", "'),'"]') As arrdate FROM table1;

您打算在这里将您的数据转换为类似 JSON 的字符串。当然,您可以调用 JSON.parseeval 并为此结果赋值,但我推荐一种更优雅的方式:

SELECT GROUP_CONCAT(phdate SEPARATOR ',') As dates FROM table1;

上面将包含一个以逗号分隔的日期字符串。假设您将其放入名为 myDates 的 JS 变量中,您可以调用:

myDates.split(",")

let myDates = '2021-01-13,2021-02-02,2021-03-04'; //results from db

console.log(myDates.split(','));

【讨论】:

就是这样!我知道它就这么简单。我更改了我的查询并使用了split(,) 并且它有效! @fadlikidd 很高兴您的问题得到了解决。【参考方案2】:

在 SQL 的WHERE 子句中生成其中任何一个:

arrdate IN ("2021-01-01", "2021-02-12", "2021-02-13")

FIND_IN_SET(arrdate, "2021-01-01,2021-02-12,2021-02-13")

第一个的性能可能受益于合适的INDEX;第二个不会。

如果您尝试检查是否在第二组日期中的任何一个中找到多个日期(或其他值)中的任何一个 - 这在 MySQL 中不直接可用。将一个列表(或另一个列表)拆分为表格中的行,然后使用INFIND_IN_SET()

或使用应用程序代码。

【讨论】:

以上是关于将选定日期与表列或 MySQL 查询生成的日期数组进行比较的主要内容,如果未能解决你的问题,请参考以下文章

MySQL在不使用表列的情况下选择两列之间的范围日期

Mysql查询检索帖子并根据特定日期间隔进行过滤

应该按哪个顺序(表列或查询)复合索引?

SQLAlchemy ORM如何将查询与表连接起来

将日期与laravel中mysql json数组的每个值进行比较

FPDF:不为日历选定日期生成报告数据