我正在开发一个html5 / jqm / phonegap应用程序。我正在从客户端数据库表中选择一个记录列表。我想按日期对它们进行分组和排序,但表中存在的日期是JS日期对象,如:
Mon Nov 19 2012 16:20:55 GMT+0000 (GMT)
我想在数字日(本例中为18,19,20)对它们进行分组和排序。以下是详细信息:
Sun Nov 18 2012 16:20:55 GMT+0000 (GMT)
Mon Nov 19 2012 16:20:55 GMT+0000 (GMT)
Sun Nov 18 2012 16:20:55 GMT+0000 (GMT)
Tue Nov 12 2012 16:20:55 GMT+0000 (GMT)
将按此顺序返回:
Tue Nov 20 2012 16:20:55 GMT+0000 (GMT)
Mon Nov 19 2012 16:20:55 GMT+0000 (GMT)
Sun Nov 18 2012 16:20:55 GMT+0000 (GMT)
Sun Nov 18 2012 16:20:55 GMT+0000 (GMT)
是否可以在sql中执行此操作作为select的一部分?或者,如果没有,有人会在Js / jQuery中如何在正确的方向上发挥作用吗?
提前致谢
**编辑以回应Pete **的问题
我正在使用SQL的Jaascript / html5客户端版本,我认为它基于SQLite。要创建数据库,我只是调用以下js -
var db = openDatabase(shortName, version, displayName, maxSize);
我的Db架构是:
transaction.executeSql('CREATE TABLE RECORDINGS (id INTEGER PRIMARY KEY AUTOINCREMENT, caseRef, startDate, endDate, caseTypeId, actionTypeId, notes, userId, syncStatus);');
transaction.executeSql('INSERT INTO RECORDINGS (caseRef, startDate, endDate, caseTypeId, actionTypeId, notes, userId, syncStatus) VALUES ("CR1234", "'+startDate+'", "'+endDate+'", 1, 2, "Meeting about something", 1, 0);');
我的选择目前看起来像:
function getRecordingsQuery(transaction) {
transaction.executeSql('SELECT RECORDINGS.id, RECORDINGS.caseRef, RECORDINGS.startDate, RECORDINGS.endDate, RECORDINGS.notes, RECORDINGS.syncStatus, CASETYPES.description FROM RECORDINGS, CASETYPES WHERE RECORDINGS.caseTypeId = CASETYPES.id AND RECORDINGS.userId =? ORDER BY startDate DESC', [window.currentSignedInUserId], getRecordingsDataHandler, errorHandler);
}
这有帮助吗?
答案 0 :(得分:0)
<强>更新强>
SQLLite不支持DATEPART
,但它支持strftime
。尝试将以下内容添加为ORDER BY
:
ORDER BY CAST(strftime("%d", date) AS INTEGER) DESC
您可以在JavaScript中处理排序。我确信有更好或更有效的方法来做到这一点,但你可以像这样使用内置的数组排序:
var getRecordingsDataHandler = function getRecordingsDataHandler(tx, results) {
var rows = [],
row = null,
i = 0;
if (results.rows && results.rows.length) {
for (i = 0; i < results.rows.length; i += 1) {
rows.push({
"startDate": new Date(results.rows.item(i).startDate),
"data": results.rows.item(i)
});
}
rows.sort(function (a, b) {
var ascending = a.startDate.getDate() - b.startDate.getDate(),
descending = b.startDate.getDate() - a.startDate.getDate();
return descending;
});
for (i = 0; i < rows.length; i += 1) {
row = rows[i].data;
//process the rest
//since row === results.rows.item(i), reference from row
}
}
};
<强> ORIGINAL:强>
如果不知道您使用的是什么SQL版本,则很难回答问题的这一部分。我认为他们中的大多数都支持DATEPART
函数,所以你可以尝试:
ORDER BY DATEPART(dd, YourDateField) DESC
就JavaScript / jQuery而言:
var d = new Date('Tue Nov 20 2012 16:20:55 GMT+0000 (GMT)');
将在JavaScript中返回一个日期对象,然后您可以对其进行排序。仅限日期:
d.getDate(); //returns day of month
如果您可以在您的问题中更具体一点(您正在使用的SQL的引擎/版本,或者您的客户端表的结构以及您用于对其进行排序的功能),那么我们也许能够为你提供更好的帮助。