【发布时间】:2020-10-06 17:03:56
【问题描述】:
我正在处理我有 2 张桌子的任务。即tickets 和holidays。
现在我也有完成门票的天数。现在我需要通过排除假期(在holidays 表中指定)和weekends 来查找预期日期。
现在我可以使用ticket created date 和days to complete the ticket 查找日期。但无法通过移除节假日和周末来计算预计到期日。
如果机票预计到期日在节假日或周末,我们需要将预计到期日提前。
然后我们需要比较ticket_closed_date和expected_due_date。
如果ticket_closed_date <= expected_due_date 则需要将isSlaMet 作为YES 返回。否则需要将isSlaMet 作为NO 返回。
票务表
假期表
示例: 通常,如果在 2nd October,2020 创建工单并且完成天数是 3,那么预计到期日将是 5th October,我们有一个假期,@ 987654342@。但是在工单创建日期和预计到期日期之间有 1 个假期和 2 个周末。即3rd, 4th and 5th of October 。所以我们需要将预产期延长3 days(因为2个周末+1个假期)。即8th October。票在9th October关闭。
然后我们需要比较ticket closed date(9th october)和expected due date(8th October),并将isSlaMet作为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;
【问题讨论】:
-
图片中的样本数据没有用。替换为 CREATE TABLE + INSERT INTO 脚本。并为提供的样本数据显示所需的输出。
-
我只能再次向您推荐我原来的评论
-
我已添加示例数据 我告诉您示例数据必须是 CREATE TABLE 和 INSERT INTO 脚本的组合。现在看看提供的“预期输入”......
-
假期表中有周末吗?这将大大简化问题。
标签: mysql sql datetime count recursive-query