gpt4 book ai didi

mongodb - 获取Mongodb中两个日期之间的工作日数

转载 作者:可可西里 更新时间:2023-11-01 09:34:50 25 4
gpt4 key购买 nike

我是 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) 之间的工作日数。

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

请求任何帮助。

最佳答案

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

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

_Dec23___Dec24___Dec25____... ____Dec30___Dec31___Jan01___...

__Fri______Sat_____Sun______...______Fri_____Sat_____Sun_____...

如您所见,这些日期之间有 4 个周末(12 月 24 日、12 月 25 日、12 月 31 日和 1 月 1 日)。

解决方案

以编程方式解决它的一种方法是使用聚合框架及其算术日期聚合运算符

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

  1. 找出 startDate 之间的整周endDate (将其命名为 weeksBetween )。在上面的例子中 weeksBetween = 1 .
  2. 查找 startDate + 7 * weeksBetween 之间的全天数endDate (将其命名为 left ,可以是 1、2、3、4、5 或 6)。在上面的例子中 left = 3 (左边的日子是周五、周六和周日)。感兴趣的是那些剩下的日子里的周末数量(命名为 left_weekends ,它可以是 0,1 或 2)。在上面的例子中 left_weekends = 2 .

然后,周末的总数是2 * weeksBetween + left_weekends .在上面的例子中它是 2 * 1 + 2 = 4 .

寻找left_weekends你可以使用 $dayOfWeek 日期聚合运算符

  1. dayOfWeek = 1left_weekends = 1如果left是 1,2,3,4,5 或 left_weekends = 2如果left是 6(包括周日和下周六)。
  2. 星期一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 stage 您还可以获得两个日期之间的天数和周末总数。不要忘记在测试查询之前更改集合名称。

关于mongodb - 获取Mongodb中两个日期之间的工作日数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39251477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com