WebSQL查询失效:如何从数据库筛选今日任务数据?
解决WebSQL筛选今日任务数据的问题
你遇到的核心问题是:数据库里的START_DATE字段包含完整的时间戳(比如2018-04-23 0:52),但你用moment生成的curDate是纯日期格式(YYYY-MM-DD),直接用等于匹配会因为格式不一致导致查询失效。WebSQL基于SQLite语法,我们可以用两种方式解决这个问题:
方案一:用SQLite的DATE()函数提取日期部分
SQLite的DATE()函数可以自动从带时间的字符串中提取出YYYY-MM-DD格式的日期,这样就能和你生成的curDate直接匹配。示例代码如下:
var curDate = moment().format('YYYY-MM-DD'); this.db.transaction(function(tx) { tx.executeSql( 'SELECT * FROM TASK_ITEM WHERE DATE(START_DATE) = ?', [curDate], function(tx, results) { // 遍历处理查询结果 for (let i = 0; i < results.rows.length; i++) { console.log('今日任务:', results.rows.item(i)); } }, function(tx, error) { console.error('查询出错:', error.message); } ); });
这种方式代码简洁,不需要手动处理时间范围,适合快速实现需求。
方案二:时间范围查询(性能更优)
如果你的START_DATE字段建了索引,推荐用时间范围查询,这样能利用索引提升查询效率。我们只需要查询今日00:00:00到明日00:00:00之间的数据:
// 获取今日起始时间和明日起始时间 var startOfToday = moment().startOf('day').format('YYYY-MM-DD HH:mm:ss'); var startOfTomorrow = moment().add(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss'); this.db.transaction(function(tx) { tx.executeSql( 'SELECT * FROM TASK_ITEM WHERE START_DATE >= ? AND START_DATE < ?', [startOfToday, startOfTomorrow], function(tx, results) { // 处理查询结果 for (let i = 0; i < results.rows.length; i++) { console.log('今日任务:', results.rows.item(i)); } }, function(tx, error) { console.error('查询出错:', error.message); } ); });
这个方式能精准覆盖今日所有带时间的任务,同时避免了函数计算对索引的影响。
额外提示
需要注意的是,WebSQL已经被W3C标记为废弃标准,后续浏览器可能会逐步停止支持。如果你的项目还处于早期阶段,建议考虑切换到IndexedDB——它是目前官方推荐的浏览器端数据存储方案,功能更完善且兼容性更好。
内容的提问来源于stack exchange,提问作者Amely
相关产品推荐
相关产品推荐

