写在前面 参考文章
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-你需要的数,自建一个
纯手打,不喜勿碰,欢迎指正