如何在 MySQL 中排除周末和节假日日期并查找预期日期?

2024-07-04

我正在执行一项有两张桌子的任务。 IE,tickets and holidays.

现在我也有完成票的天数了。现在我需要通过排除假期(在holidays表)和weekends.

现在我可以使用查找日期ticket created date and days to complete the ticket。但无法通过除去节假日和周末来计算预计预产期。

如果机票预计到期日恰逢节假日或周末,我们需要将预计到期日提前。

之后我们需要比较ticket_closed_date and expected_due_date.

If ticket_closed_date <= expected_due_date然后需要返回isSlaMet as YES。否则需要返回isSlaMet as NO.

门票表

假期表

Example:一般来说,如果工单创建于2nd October,2020完成的天数是3,那么预计的到期日是,5th October我们有一个假期,5th October。但工单创建日期和预计截止日期之间有 1 个假期和 2 个周末。 IE,3rd, 4th and 5th of October 。所以我们需要将预计到期日延长3 days(因为 2 个周末 + 1 个假期)。 IE,8th October。门票截止日期为9th October.

然后我们需要比较ticket closed date(9th october) and expected due date(8th October)并返回isSlaMet as YES.

预期输入

Tickets Table
--------------------------------------------------------------------------------
tid         createdAt         apply_sla    ticket_closed_date     days_to_complete
--------------------------------------------------------------------------------
100    2020-10-02 00:00:00        1       2020-10-09 00:00:00           3       
--------------------------------------------------------------------------------
       
Holidays Table
----------------------------------------------
id        holiday_date          end_date
----------------------------------------------
20         2020-10-05          2020-10-05
----------------------------------------------

Along with the above holiday, we need to exclude Weekends.

预期输出

Tickets Table
--------------------------------------------------------------------------------------------------------------------------
tid       createdAt     apply_sla    ticket_closed_date   days_to_complete   expected_due_date    completedIn   isSlaMet
--------------------------------------------------------------------------------------------------------------------------
100  2020-10-02 00:00:00    1       2020-10-09 00:00:00             3        2020-10-08 00:00:00      4           NO
  
--------------------------------------------------------------------------------------------------------------------------

这是我到目前为止一直在使用的查询。

    SELECT 
        `t`.`tid`, `t`.`createdAt`, `t`.`days_to_complete`,
        `t`.`ticket_closed_date`,`holidays`.`holiday_date`,
        `holidays`.`end_date`, `t.apply_sla`,
        IF(ISNULL(`t`.`ticket_closed_date`),
            NULL,
            IF((`t`.`apply_sla` = 1),
                IF(((CAST(`t`.`createdAt` AS DATE) + INTERVAL (`t`.`days_to_complete` + 1) DAY) BETWEEN `holidays`.`holiday_date` AND `holidays`.`end_date`),
                    IF((CAST(`t`.`ticket_closed_date` AS DATE) <= (`holidays`.`end_date` + INTERVAL `t`.`days_to_complete` DAY)),
                        'YES',
                        'NO'),
                    IF((CAST(`t`.`ticket_closed_date` AS DATE) <= (`t`.`createdAt` + INTERVAL (`t`.`days_to_complete` + 1) DAY)),
                        'YES',
                        'NO')),
                IF(((TO_DAYS(`t`.`ticket_closed_date`) - TO_DAYS(`t`.`createdAt`)) > (`t`.`days_to_complete` + 1)),
                    'NO',
                    'YES')
            )
        ) AS `isSlaMet`
    FROM
        (`tickets` `t`
        LEFT JOIN `holidays` ON (((CAST(`t`.`createdAt` AS DATE) + INTERVAL (`t`.`days_to_complete` + 1) DAY) BETWEEN `holidays`.`holiday_date` AND `holidays`.`end_date`)))
    ORDER BY `t`.`tid` DESC;

这可能看起来更复杂。最简单的方法可能是暴力破解:使用递归 CTE(仅在 MySQL 8.0 中可用)枚举票证创建日期和关闭日期之间的所有日期,然后过滤掉周末和节假日来计算 SLA 天数:

with recursive cte_tickets as (
    select tid, created_at as dt, ticket_closed_date
    from tickets 
    where apply_sla = 1
    union all
    select tid, dt + interval 1 day, ticket_closed_date
    from cte_tickets
    where dt < ticket_closed_date
)
select t.*, 
    t.created_at 
        + interval (t.days_to_complete + sum(weekday(dt) in (5, 6) or h.holiday_date is not null)) day
        as expected_due_date,    
    count(*) - sum(weekday(dt) in (5, 6) or h.holiday_date is not null) - 1 completed_in,
    t.ticket_closed_date <= t.created_at 
        + interval (t.days_to_complete + sum(weekday(dt) in (5, 6) or h.holiday_date is not null)) day
        as is_sla_met
from tickets t
inner join cte_tickets ct on ct.tid = t.tid
left join holidays h on ct.dt between h.holiday_date and h.end_date
group by t.tid

:



tid | created_At          | apply_sla | ticket_closed_date  | days_to_complete | expected_due_date   | completed_in | is_sla_met
--: | :------------------ | :-------- | :------------------ | ---------------: | :------------------ | -----------: | ---------:
100 | 2020-10-02 00:00:00 | 1         | 2020-10-09 00:00:00 |                3 | 2020-10-08 00:00:00 |            4 |          0
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MySQL 中排除周末和节假日日期并查找预期日期? 的相关文章

  • php:如何将字符串数据更改为数字数据

    你能告诉我如何在 php 和 mysql 脚本中更改这个结果吗 Model Class Ball S Book A Spoon Plate B Box C 这是我的数据库 CREATE TABLE IF NOT EXISTS inspect
  • R-特殊字符没有插入到mysql中

    如何使用r编程将特殊字符插入MySQL 我有一个数据框 它将从 tsv 文件读取数据 我想将这些值插入到包含 2000 行的 mysql 数据库数据框中 但它只插入 23 行 我正在使用 RODBC 库 问题在于数据中的特殊字符 样本数据
  • 数据库异常 - 一般错误:1021 磁盘已满

    谁能帮我理解为什么这个查询说光盘已满 数据库异常 SQLSTATE HY000 一般错误 1021 磁盘已满 tmp sql 1445 3 MAI 等待有人释放一些空间 错误号 28 设备上没有剩余空间 Query 这是服务器问题 只有楼主
  • Sails.js 关联

    我从 sails js 开始 但我完全迷失了我的 sql 查询 我有以下表格 genres Field Type Null Key id int 6 NO PRI name varchar 100 NO slug varchar 255 N
  • MySQL 存储过程准备语句(动态 SQL)参数化

    我正在尝试编写一个 MySQL 搜索函数 该函数构建动态 sql 值并通过准备好的语句执行它 显然 为了安全起见 我想通过参数传递用户输入 搜索词 但我不知道如何将一个参数与多个参数匹配 查询中的标记 可能最好地表达我的意思 CREATE
  • RODBC 查询错误地返回零行

    我遇到过类似的帖子 但我的问题看起来不同 我无法使用 rows at time 1 或 believeNRows False 修复这些查询的结果 我正在尝试使用 R 中的 RODBC 连接到 Oracle 数据库 我能够连接到数据库 但除了
  • SQL Loader 脚本帮助添加 SYSDATE、USER

    我正在尝试从文件加载数据 并且想将 CREATED DATE 和 UPDATED DATE 设置为 SYSDATE 将 CREATE BY 和 UPDATED BY 设置为 USER 这是我正在使用的表 CREATE TABLE CATAL
  • 如何解决phpmyadmin超时问题?

    我想要导入巨大的 at least300 mb 通过 phpMyAdmin 的 SQL 脚本 我试过了 post max size 750M upload max filesize 750M max execution time 300 m
  • 针对 MySQL 在 Hibernate 实体中建模 UUID

    我有一个very类似的问题this one https stackoverflow com q 6522420 4009451 但是我的问题比那个问题更基本 所以我不feel就像它是一个骗子 我们会看看SO的想法 And如果这是另一个问题的
  • 如果 B 列不为空,Google 表格会自动递增 A 列

    如果 B 列不为空 我想自动增加 A 列 例如 如果我向 B14 输入任何内容 我希望 A14 自动递增 我怎样才能做到这一点 如果 B 列没有被空单元格打断 那么您只需 SEQUENCE COUNTA B2 B
  • 授予对其他 MySQL 数据库的权限会导致问题

    我有一个用户 myuser 和两个数据库 db1 and db2 myuser 已经有使用权db1我想授予他额外的权限来使用 db2 通过使用以下查询 GRANT ALL ON db2 TO myuser localhost 在我运行拨款声
  • 是否有一个表保存 sysobjects.xtype 描述的列表?

    根据sysobjects 文档 https msdn microsoft com en us library ms177596 aspx sysobjects xtype可以是以下对象类型之一 xtype Description AF Ag
  • 将datagridview的所有数据插入数据库vb.net

    Dim Con As OleDbConnection New OleDbConnection Provider Microsoft Jet OLEDB 4 0 Data Source Music Sales Database mdb Dim
  • 如何计算 django 连接表中对象的数量?

    我的问题很简单 我有Users谁拥有Assets or Assets属于用户的如果您愿意 但我无法检索其数量 计数 Assets each User有 我知道这对你们大多数人来说可能听起来很愚蠢 但我是 python django 来自 P
  • 如何打印导致ORA-01843错误的记录?

    我有一个包含数百万条记录的表 我正在尝试将一列数据格式化为DATE格式 目前处于VARCHAR2 但是 我越来越ORA 01843不是有效的月份错误 我正在尝试获取导致 ORA 01843 的那些记录 CREATE OR REPLACE P
  • 在 Ruby on Rails 中使用 fork 创建并行进程

    我在 Apache 上使用 Passenger 制作了一个 Rails 3 应用程序 我有这个代码 class Billing lt ActiveRecord Base after save sendEmails private def s
  • 获取每个人每天的最短日期时间的记录

    CREATE TABLE IF NOT EXISTS accesscards id int 11 NOT NULL AUTO INCREMENT department varchar 255 NOT NULL name varchar 25
  • SQL 关键字使用大写有充分的理由吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 默认值似乎是大写 但是真的有理由使用大写关键字吗 I started using upper case because I was just t
  • 如何获得 firebird 数据库上的独占锁以执行架构更改?

    更具体地说 我正在使用 firebird 2 1 和 Visual Studio 的 DDEX Provider 并且我正在使用 c 工作 我遇到一种情况 我试图将模式更改从 C 应用到数据库 以 更新 我的数据库 在此过程中 我从 fir
  • Oracle ProC INSERT INTO VALUES ( (选择 ...) )

    在 Oracle 10g 上运行 Pro C 我希望在插入语句值子句中执行子查询 该 sql 查询完全有效 并且在 TOAD 中运行没有任何问题 但 Pro C 无法解析该查询 EXEC SQL INSERT INTO TARGET ATT

随机推荐