将选定日期与表列或 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 查询结果中的日期数据列表。简而言之,我只想要一个动态的值数组,而不是对其进行硬编码。<%
...%>
标签是怎么回事?您使用的是 ASP 或 php,还是其他一些服务器端语言?看起来您输出日期的循环正在生成多个带有id="phdates"
的<p>
标签,这是非法的HTML(id
s 必须是唯一的)。
@kmoser 更新了标签。我没有包含 node.js
和 ejs
(<%...%>
) 标签,因为我认为我的问题是关于“如何从 MySQL 查询输出到 html 并被识别为 javascript 数组”。对于那个很抱歉。我的工作代码与 sn-p 中的完全一样。其他只是我所做的额外测试,我的代码中没有任何 <p>
(或其他)标签与重复的 id
。
由于您已经获取数据并显示到您的表格中,因此无需以数组的形式再次获取它们。您在循环中使用静态元素 ID,这很糟糕;用类名更改这些 ID。为了让您的dateChk
工作,您需要将PHDate
元素的ID 替换为类,然后在dateChk
中查询所有PHDate
类元素(使用document.querySelectorAll('.PHDate')
) 并比较每个日期,直到找到匹配项或循环结束。
【参考方案1】:
实际上有一个直接的解决方案。让我们从您的查询开始我们的思考过程,这离解决方案不是很远(这还不是很好,但已经足够接近我们的思考过程了):
SELECT CONCAT('["',GROUP_CONCAT(phdate SEPARATOR '", "'),'"]') As arrdate FROM table1;
您打算在这里将您的数据转换为类似 JSON 的字符串。当然,您可以调用 JSON.parse
或 eval
并为此结果赋值,但我推荐一种更优雅的方式:
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 中不直接可用。将一个列表(或另一个列表)拆分为表格中的行,然后使用IN
或FIND_IN_SET()
。
或使用应用程序代码。
【讨论】:
以上是关于将选定日期与表列或 MySQL 查询生成的日期数组进行比较的主要内容,如果未能解决你的问题,请参考以下文章