使用 Angular 和 moment.js 按日期检索特定数据
Retrieve specific data by date with Angular and moment.js
我有这样的数据库结构 (Firebase):
+ statistics
|-+ 2016
| |-+ 9
| |-+ hours: 0
|-+ 2017
|-+ 6
| |-+ hours: 0
|-+ 7
|-+ 8
|-+ 9
parents是岁,孩子是个月(例如9是九月)很容易创建一个列表以显示一年中所有小时的总和。例如从 2017 年开始。但是,如果我想显示从 Steptember 2016 到 2017 年 9 月的所有小时数的总和怎么办?
我正在计划一个应用程序,这对这个应用程序很重要,一年从 9 月开始,到明年 9 月结束。所以我需要从 2016->9
到 2017->9
的数据,我该如何处理呢?
我正在使用 Ionic3 / Angular2、Firebase 和 moment.js 进行日期处理。
更具体:
我想获取这样的数据:Give me all 'hours'-values from September 2016 to September 2017 and build these to an array
我假设您使用的是实时数据库;但是,我确定 Firestore design/implementation 是相似的。
您可能需要考虑这样的替代结构:
statistics: {
unix_ts_for_sept_2016: {
unix_ts: unix_ts_for_sept_2016
hours:
},
unix_ts_for_oct_2016: {
unix_ts: unix_ts_for_oct_2016
hours:
},
unix_ts_for_nov_2016: {
unix_ts: unix_ts_for_nov_2016
hours:
}
[,...]
}
时间戳作为键允许您get/set任何一个月,而时间戳作为子值允许您执行范围查询。
const path_to_statistics = 'statistics/';
const hours_field_name = 'hours';
const ts_field_name = 'unix_ts';
// Update the hours for a given month/yr in 'MM-DDDD' format
var update_hours = function(mm_dash_yyyy, delta_hours) {
const unix_ts = moment(mm_dash_yyyy, 'MM-YYYY').valueOf();
const path = path_to_statistics + unix_ts + '/' + hours_field_name;
const ref = firebase.database().ref(path);
var deferred = $q.defer();
ref.transaction(function(current) {
if (current !== null) { return current + delta_hours; }
return current;
}, function(error) {
if (error) { deferred.reject(error); }
else { deferred.resolve(); }
});
return deferred.promise;
};
// Returns sum of hours in a given date range.
var get_hours_in_range = function(start_mm_dash_yyyy, end_mm_dash_yyyy) {
const start_ts = moment(start_mm_dash_yyyy, 'MM-YYYY').valueOf();
const end_ts = moment(end_mm_dash_yyyy, 'MM-YYYY').valueOf();
const ref = firebase.database().ref(path_to_statistics);
const query = ref.orderByChild(ts_field_name).startAt(start_ts).endAt(end_ts);
var deferred = $q.defer();
query.once('value').then(function(snap) {
var hours = 0;
snap.forEach(function(child_snap) {
hours += child_snap.val()[hours_field_name];
});
deferred.resolve(hours);
}).catch(function(error) { deferred.reject(error); });
return deferred.promise;
};
//usage
update_hours('09-2016', 10).then(function() {
console.log('updated hours.');
}).catch(function(error) { console.error(error); })
get_hours_in_range('09-2016', '10-2016').then(function(hours) {
console.log(hours);
}).catch(function(error) { console.error(error); });
我有这样的数据库结构 (Firebase):
+ statistics
|-+ 2016
| |-+ 9
| |-+ hours: 0
|-+ 2017
|-+ 6
| |-+ hours: 0
|-+ 7
|-+ 8
|-+ 9
parents是岁,孩子是个月(例如9是九月)很容易创建一个列表以显示一年中所有小时的总和。例如从 2017 年开始。但是,如果我想显示从 Steptember 2016 到 2017 年 9 月的所有小时数的总和怎么办?
我正在计划一个应用程序,这对这个应用程序很重要,一年从 9 月开始,到明年 9 月结束。所以我需要从 2016->9
到 2017->9
的数据,我该如何处理呢?
我正在使用 Ionic3 / Angular2、Firebase 和 moment.js 进行日期处理。
更具体:
我想获取这样的数据:Give me all 'hours'-values from September 2016 to September 2017 and build these to an array
我假设您使用的是实时数据库;但是,我确定 Firestore design/implementation 是相似的。
您可能需要考虑这样的替代结构:
statistics: {
unix_ts_for_sept_2016: {
unix_ts: unix_ts_for_sept_2016
hours:
},
unix_ts_for_oct_2016: {
unix_ts: unix_ts_for_oct_2016
hours:
},
unix_ts_for_nov_2016: {
unix_ts: unix_ts_for_nov_2016
hours:
}
[,...]
}
时间戳作为键允许您get/set任何一个月,而时间戳作为子值允许您执行范围查询。
const path_to_statistics = 'statistics/';
const hours_field_name = 'hours';
const ts_field_name = 'unix_ts';
// Update the hours for a given month/yr in 'MM-DDDD' format
var update_hours = function(mm_dash_yyyy, delta_hours) {
const unix_ts = moment(mm_dash_yyyy, 'MM-YYYY').valueOf();
const path = path_to_statistics + unix_ts + '/' + hours_field_name;
const ref = firebase.database().ref(path);
var deferred = $q.defer();
ref.transaction(function(current) {
if (current !== null) { return current + delta_hours; }
return current;
}, function(error) {
if (error) { deferred.reject(error); }
else { deferred.resolve(); }
});
return deferred.promise;
};
// Returns sum of hours in a given date range.
var get_hours_in_range = function(start_mm_dash_yyyy, end_mm_dash_yyyy) {
const start_ts = moment(start_mm_dash_yyyy, 'MM-YYYY').valueOf();
const end_ts = moment(end_mm_dash_yyyy, 'MM-YYYY').valueOf();
const ref = firebase.database().ref(path_to_statistics);
const query = ref.orderByChild(ts_field_name).startAt(start_ts).endAt(end_ts);
var deferred = $q.defer();
query.once('value').then(function(snap) {
var hours = 0;
snap.forEach(function(child_snap) {
hours += child_snap.val()[hours_field_name];
});
deferred.resolve(hours);
}).catch(function(error) { deferred.reject(error); });
return deferred.promise;
};
//usage
update_hours('09-2016', 10).then(function() {
console.log('updated hours.');
}).catch(function(error) { console.error(error); })
get_hours_in_range('09-2016', '10-2016').then(function(hours) {
console.log(hours);
}).catch(function(error) { console.error(error); });