You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Wix集合中两个日期字段的区间查询?

Wix日期范围查询代码问题排查与修正

核心问题分析

你的代码存在三个关键问题:

  • 错误复用查询对象:results.query是已执行查询的原始对象,无法直接追加条件并重新执行find(),二次查询的逻辑完全错误。
  • 空值未处理导致报错:if判断用||,当其中一个日期选择器为空时(比如起始日期未选择),调用getFullYear()会直接抛出null对象的方法调用错误。
  • 查询逻辑拆分不合理:先执行标题查询再过滤日期,不仅效率低,还会导致结果不准确。

修正后的代码

场景1:集合中startingDate和endingDate为Date类型字段

function search() {
    const titleKeyword = $w('#input11').value;
    const startDate = $w("#startingDatePicker").value;
    const endDate = $w("#endingDatePicker").value;

    // 初始化基础查询
    let query = wixData.query("Collection1");

    // 添加标题模糊匹配条件(如果有输入)
    if (titleKeyword) {
        query = query.contains("title", titleKeyword);
    }

    // 添加起始日期筛选(如果选择了日期)
    if (startDate) {
        // 构造当天0点整的Date对象,确保包含全天数据
        const startDateObj = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate(), 0, 0, 0);
        query = query.ge("startingDate", startDateObj);
    }

    // 添加结束日期筛选(如果选择了日期)
    if (endDate) {
        // 构造当天23:59:59的Date对象,确保包含全天数据
        const endDateObj = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate(), 23, 59, 59);
        query = query.le("endingDate", endDateObj);
    }

    // 执行最终查询并更新重复器
    query.find()
        .then(results => {
            $w('#repeater1').data = results.items;
            console.log("查询到的结果数量:", results.items.length);
        })
        .catch(err => {
            console.error("查询失败:", err);
        });
}

场景2:集合中startingDate和endingDate为MM/DD/YYYY格式的字符串字段

如果你的集合日期是字符串存储,需要先把日期选择器的Date对象转成对应格式的字符串,再进行比较:

// 新增日期格式化函数
function formatDateToMMDDYYYY(date) {
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    const year = date.getFullYear();
    return `${month}/${day}/${year}`;
}

function search() {
    const titleKeyword = $w('#input11').value;
    const startDate = $w("#startingDatePicker").value;
    const endDate = $w("#endingDatePicker").value;

    let query = wixData.query("Collection1");

    if (titleKeyword) {
        query = query.contains("title", titleKeyword);
    }

    if (startDate) {
        const formattedStart = formatDateToMMDDYYYY(startDate);
        query = query.ge("startingDate", formattedStart);
    }

    if (endDate) {
        const formattedEnd = formatDateToMMDDYYYY(endDate);
        query = query.le("endingDate", formattedEnd);
    }

    query.find()
        .then(results => {
            $w('#repeater1').data = results.items;
        })
        .catch(err => {
            console.error("查询失败:", err);
        });
}

额外说明

你提到console.log输出的日期是英文格式,这是JavaScript Date对象默认的toString()输出,属于调试信息,不影响查询功能。如果需要在页面上显示中文格式的日期,再用上面的formatDateToMMDDYYYY函数或其他格式化方式处理即可。

内容的提问来源于stack exchange,提问作者Al.Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:00:16