【问题标题】:SQL query to Get amount of days off in a periodSQL查询获取一段时间内的休假天数
【发布时间】:2021-05-31 22:20:46
【问题描述】:

请帮我写一个 Sql 查询或使用 Eloquent 来获取车辆和给定时间段内的休假天数。

车辆表:

|id |name     |
|---|---------|
| 1 | Truck   |
| 2 | Crane   |

休息日:

| vehicle_id| day_num|
| ----------|--------|
| 1         |5       | //Friday
| 1         |6       | //Saturday
| 2         |3       | //Wednesday
| 2         |4       | //Thursday

示例。 申请时间:02-03-2021 - 19-03-2021

时间段由用户输入,他希望在此时间段内收到车辆的休息天数

预期结果:

id:1
days_off_amount: 5 
id:2
days_off_amount:6 

【问题讨论】:

  • 嗨,你目前的代码在哪里?
  • 需要说明如何调用需要搜索周期范围的列
  • 时间段由用户输入,他希望在此时间段内收到车辆的休息天数。

标签: sql laravel eloquent mariadb


【解决方案1】:

我的建议是在 SQL 中执行此操作。首先生成在此期间所需的所有日期 - 这很容易使用递归 CTE 完成。

然后使用LEFT JOIN 和聚合来计算不匹配的天数:

with recursive dates as (
      select date('2021-03-01') as date
      union all
      select date + interval 1 day
      from dates
      where date < '2021-03-19'
     )
select v.id, v.name, sum(doff.vehicle_id is not null) as num_days
from vehicles v cross join
     dates d left join
     daysoff doff
     on doff.vehicle_id = v.id and
        weekday(d.date) = day_num - 1
group by v.id, v.name;

注意:不清楚您的日期编号是什么。您需要weekday()dayofweek(),具体取决于星期是从周日还是周一开始。所以你可能需要调整这个例子。

Here 是一个 dbfiddle。

【讨论】:

  • 我将 sum(doff.vehicle_id is null) 更改为 sum(doff.vehicle_id is not null) 并得到了正确的解决方案!
  • 是否可以修改这个请求到数据库并找出最终的工作日期?例如:2021-03-10 需要车辆 30 天,但期间有休息日。考虑到周末,是否可以在请求中输入车辆将在所有 30 天内工作的最终日期?
  • @Nikolay 。 . .我怀疑像 max(case when doff.vehicle_id is null then d.date end) 这样的东西可以满足您的需求。
  • 在我看来,我们需要在 sql 查询中使用一个循环,我们将在其中迭代工作日,直到获得必要的结束日期。我没有结束日期,但我有所需的工作日。我需要添加沿途的所有周末。这个循环会是什么样子?谢谢。
  • @Nikolay 。 . .您可能想问另一个问题,并提供清晰的解释和示例数据。
【解决方案2】:

这会显示完整的表格吗?假设是这样,你不能这样做。如果要按完整日期过滤数据,则需要记录每天休息的完整日期。您当前的离桌日期有星期几,但没有月份或年份的日期,因此您根本没有可与之比较的信息。将“day_of_week”替换为名为“day_off_at”的日期类型的列将完成此操作。

然后,您需要更新写入此表的应用程序部分,以 mysql 可以理解的格式发送完整日期,例如“2021-03-30”,然后您可以查询日期字段反对,例如'select * from days_off where day_off_at > '2021-02-01' and day_off_at

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多