将所选日期与 table 列或从 MySQL 查询生成的日期数组进行比较
Compare a selected date against a table column or an array of dates produced from MySQL query
我有一个如下所示的页面:
我想做的是将“假期日期:”选择与其下方 table 中的“日期”列中的行值进行比较。我试过使用这样的代码:
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
值不同(如我上面的代码片段):
如果我特意把MySQLreturn的数据弄成上面的样子,虽然它还是不识别。我想如果这个方法可行,我什至不需要将所选日期与 table 中的列进行比较。我使用 $( "div" ).toArray()
进行了测试,但我也无法正常工作。
我认为这对我来说可能是直接的解决方案,但我想知道如何格式化 MySQL 结果值以符合正确的 javascript 数组格式?或者保留 MySQL 输出原样并将该值转换为 javascript 数组兼容值。我忍不住认为解决方案可能很简单,但我一直在寻找几天,但我没有找到任何解决方案。
实际上有一个直接的解决方案。让我们从您的查询开始我们的思考过程,这离解决方案不是很远(这还不是很好,但已经足够接近从它开始我们的思考过程):
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(','));
在 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")
第一个的表现可能受益于一个suitableINDEX
;第二个不会。
如果您尝试检查是否在第二组日期中的任何一个中找到多个日期(或其他值)中的任何一个——这在 MySQL 中不直接可用。将一个列表(或另一个列表)拆分为 table 中的行,然后使用 IN
或 FIND_IN_SET()
.
或使用应用程序代码。
我有一个如下所示的页面:
我想做的是将“假期日期:”选择与其下方 table 中的“日期”列中的行值进行比较。我试过使用这样的代码:
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
值不同(如我上面的代码片段):
如果我特意把MySQLreturn的数据弄成上面的样子,虽然它还是不识别。我想如果这个方法可行,我什至不需要将所选日期与 table 中的列进行比较。我使用 $( "div" ).toArray()
进行了测试,但我也无法正常工作。
我认为这对我来说可能是直接的解决方案,但我想知道如何格式化 MySQL 结果值以符合正确的 javascript 数组格式?或者保留 MySQL 输出原样并将该值转换为 javascript 数组兼容值。我忍不住认为解决方案可能很简单,但我一直在寻找几天,但我没有找到任何解决方案。
实际上有一个直接的解决方案。让我们从您的查询开始我们的思考过程,这离解决方案不是很远(这还不是很好,但已经足够接近从它开始我们的思考过程):
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(','));
在 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")
第一个的表现可能受益于一个suitableINDEX
;第二个不会。
如果您尝试检查是否在第二组日期中的任何一个中找到多个日期(或其他值)中的任何一个——这在 MySQL 中不直接可用。将一个列表(或另一个列表)拆分为 table 中的行,然后使用 IN
或 FIND_IN_SET()
.
或使用应用程序代码。