1

我正在开发一个 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 中执行此操作?或者,如果没有,有人可以向我指出如何在 Js/jQuery 中做到这一点的正确方向吗?

提前致谢

**根据皮特的问题进行编辑**

我使用的是 Jaascript/html5 客户端版本的 SQL,我相信它是基于 SQLite 的。要创建数据库,我只需调用以下 js -

var db = openDatabase(shortName, version, displayName, maxSize);

我的数据库架构是:

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);
    }

这有帮助吗?

4

1 回答 1

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
        }
    }
};

原来的:

在不知道您使用的 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 版本,或者您的客户端表的结构以及您用来对其进行排序的函数),那么我们可能会为您提供帮助好一点。

于 2012-11-18T17:00:12.340 回答