MYSQL 如何得到两个日期间的工作日(不含周六日,节假日)

写在前面  参考文章

SQL 如何得到两个日期间的工作日(附假期表)_Fuzz-CSDN博客_sql计算日期之间工作日函数

这篇文章使用的是SQL SEVER ,如何转化为 MYSQL 

新手尝试两个小时,不喜勿碰 (直接复制他的内容了,代码改一下)

懒得截图跟上传附件了,建议两篇文章比对着看

思路是一样的,就是将开始时间到截止时间按日期进行拆分,与工作日的辅助表进行关联,关联后对辅助列计数

SELECT
    id,
    [SP PO creation Date],
    [HUB GI date],
    COUNT (*) AS COUNT
FROM
    (
        SELECT
            id,
            [SP PO creation Date],
            [HUB GI date],
            DATEADD(
                DAY,
                number,
                [SP PO creation Date]
            ) AS riqi

-- 在这里 SQL SEVER 中DATEADD(DAY,增加的天数,字段名),MYSQL 中是 DATE_ADD(字段名,INTERVAL 增加的天数 DAY)   替换掉就好

--  然后他这里用到一个number,这个number下边说


        FROM
            [DW].[dbo].[TAB Row Data From ECC temp6] AS A
        INNER JOIN master..spt_values AS B ON DATEADD(
            DAY,
            number,
            [SP PO creation Date]
        )
<= [HUB GI date]
        AND B.[type] = 'P'

    order by id,riqi  --(没啥用,删掉了)

-- 注意标绿色的,这个代码是SQL SEVER中自带的库,MYSQL查了半天没有,或者我不知道,然后查了一下SQL SEVER 中 master..spt_values . [type] =  'P' 其实就是从0开始的一串数。然后可以再新建一个辅助表,辅助表就是从0开始一直到好多吧,你看你要计算的工作日最大能有多少,一两千都行,越多查询的越慢   

(辅助表的表名比如是 number,字段名也是number)

-- 那么上面的DATE_ADD这个代码就可以改成DATE_ADD(字段名,INTERVAL number DAY)

-- INNER JOIN 这个代码就可以改成  INNER JOIN number AS B ON...


    
        AND NOT EXISTS (
            SELECT
                1
            FROM
                [TAB].[dbo].[holiday] b
            WHERE
                [DAY_WORK] = 2
            AND DATEADD(
                DAY,
                number,
                [SP PO creation Date]
            )
= CONVERT (DATE, [DATE_ID])
        )
 

-- 这段代码是要排除出去假日的数据,但是我不知道为什么按照他的执行结果是没有排除的,可能我的水平不行吧,然后进行了一下修改

-- 首先 NOT EXISTS不知道为什么执行出来没效果,所以我用了NOT IN ,整体修改如下

AND DATE_ADD( [SP PO creation Date] ,    INTERVAL number DAY) 
                 not in 
                (
                            SELECT DATE FROM   [TAB].[dbo].[holiday]    WHERE  [DAY_WORK] = 2 
                )                    

    ) a
GROUP BY
    id,
    [SP PO creation Date],
    [HUB GI date]

-- 全部修改后的代码如下

SELECT
    id,[SP PO creation Date], [HUB GI date],COUNT (*) AS COUNT
FROM
    (
            SELECT
            id,[SP PO creation Date],[HUB GI date],
            DATE_ADD( [SP PO creation Date] ,    INTERVAL number DAY) AS riqi

            FROM
                 [DW].[dbo].[TAB Row Data From ECC temp6] AS A
            INNER JOIN number AS B ON DATE_ADD( [SP PO creation Date] ,    INTERVAL number DAY) <= [HUB GI date]

             AND DATE_ADD( [SP PO creation Date] ,    INTERVAL number DAY) 
                NOT IN
                (SELECT DATE FROM   [TAB].[dbo].[holiday]    WHERE  [DAY_WORK] = 2 )                ) a
GROUP BY
    id, [SP PO creation Date], [HUB GI date]

需要的辅助表到原文下载,或者自建一个,序号表0-你需要的数,自建一个

纯手打,不喜勿碰,欢迎指正

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值