获取Mongo DB中两个日期之间的工作日数

Giridharan ck

我是Mongo DB的新手。谁能帮我获得两个给定日期之间的工作日数。

日期的$ dayOfWeek将给出日期0(星期日)和7(星期六)的值。

但是我的问题是如何从开始日期到结束日期增加日期以查找工作日数。

样本数据:

 > db.data.insert({"startDate":ISODate('2016-0101'), "endDate":ISODate('2016-02-02')})  

    WriteResult({ "nInserted" : 1 })
    > db.data.find().pretty()
    { 
            "_id" : ObjectId("57c6e6a6a1e49d654caca17a"), 
            "startDate" : ISODate("2016-01-01T00:00:00Z"),
            "endDate" : ISODate("2016-02-02T00:00:00Z")
    }

现在需要找到开始日期(2016-01-01)和结束日期(2016-02-02)之间的工作日数。

我可以编写一个接受开始日期和结束日期的函数,但是在该函数中如何从开始日期到结束日期进行迭代?

需要任何帮助。

Tarashypka

要查找两个日期之间的工作日总数,您可以从总天数中减去周末的总数。这里的主要问题是找到周末的总数。

范例[2016-12-23; 2017-01-01]

_Dec23 ___ Dec24 ___ Dec25 ____... ____ Dec30 ___ Dec31 ___ Jan01 ___...

__Fri ______ Sat _____ Sun ______...______ Fri _____ Sat _____ Sun _____...

如您所见,在这些日期之间有4个周末(Dec24,Dec25,Dec31和Jan01)。

解决方案

一种以编程方式解决此问题的方法是使用具有算术日期聚合运算符的聚合框架

可以通过将任务分为2个子任务来完成:

  1. 查找的金额整整两周之间startDateendDate(命名weeksBetween)。在上面的例子中weeksBetween = 1
  2. 查找介于之间的整天数(将其命名为1,2,3,4,5或6)。在上面的示例中(剩余的日期是周五,周六和周日)。感兴趣的是剩余天数中的周末数量(将其命名为0,1或2)。在上面的例子中startDate + 7 * weeksBetweenendDateleftleft = 3left_weekendsleft_weekends = 2

那么,周末的总数为2 * weeksBetween + left_weekends在上面的示例中为2 * 1 + 2 = 4

要找到left_weekends您可以使用$ dayOfWeek 日期聚合运算符

  1. 对于Sun dayOfWeek = 1left_weekends = 1如果left为1,2,3,4,5或left_weekends = 2如果left为6(包括Sun和下一个星期六)。
  2. 对于Mon dayOfWeek = 2left_weekends = 0如果left为1,2,3,4或left_weekends = 1如果left为5或left_weekends = 2如果left为6(包括下一个星期六和星期日)。

...

  1. 为星期六dayOfWeek = 7left_weekends = 2任何left

因此,我们可以使用以下规则:

  1. 如果remainder > 7是的话left_weekends = 2

  2. 如果为remainder = 7,则left_weekends = 1适用于周一至周六和周日left_weekends = 2

  3. 如果是remainder < 7这样left_weekends = 0适用于周一和周六left_weekends = 1

在这里,remainder = dayOfWeek + left

询问

db.dates.aggregate(
  {
    $project:
      {
        "daysBetween":
          {
            $add: [
              {
                $floor:
                  {
                    $divide: [
                      { $subtract: [ "$endDate", "$startDate" ] },
                      1000 * 60 * 60 * 24
                    ]
                  }
              },
              1
            ]
          },
        "startDay": { $dayOfWeek: "$startDate" },
        "endDay": { $dayOfWeek: "$endDate" }
      }
  },
  {
    $project:
      {
        "daysBetween": "$daysBetween",
        "weeksBetween": { $floor: { $divide: [ "$daysBetween", 7 ] } },
        "startDay": "$startDay",
        "remainder":
          {
            $add: [
              { $abs: { $subtract: [ "$endDay", "$startDay" ] } },
              "$startDay"
            ]
          }
      }
  },
  {
    $project:
      {
        "weekendsBetween":
          {
            $add: [
              { $multiply: [ "$weeksBetween", 2 ] },
              {
                $cond:
                  {
                    if: { $gt: [ "$remainder", 7 ] },
                    then: 2,
                    else:
                      {
                        $cond:
                          {
                            if: { $eq: [ "$remainder", 7 ] },
                            then: 1,
                            else: 0
                          }
                      }
                  }
              },
              { $cond: { if: { $eq: [ "$startDay", 1 ] }, then: 1, else: 0 } }
            ]
          },
        "daysBetween": "$daysBetween"
      }
  },
  {
    $project:
      {
        "weekdaysBetween": { $subtract: [ "$daysBetween", "$weekendsBetween" ] }
      }
  }
);

样本

{ "_id": 1, "startDate": ISODate("2016-12-23T00:00:00Z"), 
            "endDate":   ISODate("2017-01-01T00:00:00Z") }
{ "_id": 2, "startDate": ISODate("2016-12-23T00:00:00Z"), 
            "endDate":   ISODate("2017-01-09T00:00:00Z") }
{ "_id": 3, "startDate": ISODate("2016-12-23T00:00:00Z"), 
            "endDate":   ISODate("2017-01-18T00:00:00Z") }  

结果

{ "_id": 1, "weekdaysBetween" : 6 }
{ "_id": 2, "weekdaysBetween" : 12 }
{ "_id": 3, "weekdaysBetween" : 19 }

PS扩展上一$project阶段,您还可以获取2个日期之间的总天数和周末。测试查询之前,请不要忘记更改集合名称。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL获取两个日期之间的工作日数

来自分类Dev

如何获取两个日期之间在Informix中的工作日数

来自分类Dev

Oracle查询以获取两个日期之间的工作日数

来自分类Dev

SQL Server 查询以获取两个日期之间的工作日数,不包括假期

来自分类Dev

如何在JavaScript中获取两个不同日期之间的工作日

来自分类Dev

在linq中获取两个日期之间的工作日计数

来自分类Dev

如何在xslt 1.0中仅获取两个日期之间的工作日

来自分类Dev

在Postgresql中获取两个日期之间的工作日

来自分类Dev

在linq中获取两个日期之间的工作日计数

来自分类Dev

SQLite:获取两个日期之间的平均工作日

来自分类Dev

获取工作日DateTime两个日期的列表

来自分类Dev

PHP 获取两个特定工作日的日期

来自分类Dev

在JavaScript中仅获取两天之间的工作日数

来自分类Dev

如何计算两个日期之间的工作日数?

来自分类Dev

如何计算两个日期之间的工作日数

来自分类Dev

应用于分组数据框中的组的两个日期之间的工作日数

来自分类Dev

如何在mongo db中的两个DateString格式日期之间查找数据?

来自分类Dev

SQL查询从两个日期列获取工作日

来自分类Dev

如何在PHP Laravel中的两个日期之间从db获取所有数据?

来自分类Dev

在mysql中的两个日期之间获取数据

来自分类Dev

在MVC中获取两个日期之间的数据

来自分类Dev

在Python中获取两个Unix日期之间的差异

来自分类Dev

在TSQL中获取两个日期之间的月份

来自分类Dev

获取MySQL中两个日期之间的差异天数

来自分类Dev

在MYSQL中获取两个日期范围之间的记录

来自分类Dev

获取每行中两个日期之间的差

来自分类Dev

获取 MySQL 中两个日期之间的值差

来自分类Dev

在Power Pivot中计算两个日期之间的工作日数

来自分类Dev

在两个日期之间获取文件

Related 相关文章

  1. 1

    SQL获取两个日期之间的工作日数

  2. 2

    如何获取两个日期之间在Informix中的工作日数

  3. 3

    Oracle查询以获取两个日期之间的工作日数

  4. 4

    SQL Server 查询以获取两个日期之间的工作日数,不包括假期

  5. 5

    如何在JavaScript中获取两个不同日期之间的工作日

  6. 6

    在linq中获取两个日期之间的工作日计数

  7. 7

    如何在xslt 1.0中仅获取两个日期之间的工作日

  8. 8

    在Postgresql中获取两个日期之间的工作日

  9. 9

    在linq中获取两个日期之间的工作日计数

  10. 10

    SQLite:获取两个日期之间的平均工作日

  11. 11

    获取工作日DateTime两个日期的列表

  12. 12

    PHP 获取两个特定工作日的日期

  13. 13

    在JavaScript中仅获取两天之间的工作日数

  14. 14

    如何计算两个日期之间的工作日数?

  15. 15

    如何计算两个日期之间的工作日数

  16. 16

    应用于分组数据框中的组的两个日期之间的工作日数

  17. 17

    如何在mongo db中的两个DateString格式日期之间查找数据?

  18. 18

    SQL查询从两个日期列获取工作日

  19. 19

    如何在PHP Laravel中的两个日期之间从db获取所有数据?

  20. 20

    在mysql中的两个日期之间获取数据

  21. 21

    在MVC中获取两个日期之间的数据

  22. 22

    在Python中获取两个Unix日期之间的差异

  23. 23

    在TSQL中获取两个日期之间的月份

  24. 24

    获取MySQL中两个日期之间的差异天数

  25. 25

    在MYSQL中获取两个日期范围之间的记录

  26. 26

    获取每行中两个日期之间的差

  27. 27

    获取 MySQL 中两个日期之间的值差

  28. 28

    在Power Pivot中计算两个日期之间的工作日数

  29. 29

    在两个日期之间获取文件

热门标签

归档