Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Tính chênh lệch timestamp theo giờ trong MongoDB (aggregate)

Vấn đề

Tính khoảng thời gian giữa 2 trường timestamp (ISODate) trong MongoDB, kết quả trả về đơn vị giờ.

Giải pháp: Aggregation Pipeline

Sử dụng $subtract để lấy chênh lệch milliseconds, sau đó $divide cho 3.600.000 (ms/giờ).

Ví dụ minh họa

1. Tạo collection dữ liệu phim

> db.timestampDifferenceDemo.insertOne({
  "MovieBeginningTime": new ISODate("2019-05-12 10:20:30"),
  "MovieEndingTime": new ISODate("2019-05-12 12:30:20")
});
> db.timestampDifferenceDemo.insertOne({
  "MovieBeginningTime": new ISODate("2019-05-12 04:00:00"),
  "MovieEndingTime": new ISODate("2019-05-12 07:10:00")
});

2. Pipeline aggregation

> db.timestampDifferenceDemo.aggregate([
  {$project: {
    DifferenceInHours: {$divide: [{$subtract: ["$MovieEndingTime", "$MovieBeginningTime"]}, 3600000]}
  }}
]);

3. Kết quả

{ "_id" : ObjectId("5cd7ba1f6d78f205348bc644"), "DifferenceInHours" : 2.1638888888888888 }
{ "_id" : ObjectId("5cd7ba3b6d78f205348bc645"), "DifferenceInHours" : 3.1666666666666665 }

Giải thích

  • $subtract: ["$end", "$start"] → chênh lệch milliseconds (số nguyên).
  • $divide: [chênh_lệch_ms, 3600000] → chuyển sang giờ (số thực).
  • 3600000 = 1000 ms × 60 s × 60 min.

Mở rộng

Để lấy giờ, phút, giây riêng biệt: dùng $floor, $mod hoặc các toán tử date như $hour, $minute, $second sau khi chuyển chênh lệch về Date object.