200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > MYSQL 如何得到两个日期间的工作日(不含周六日 节假日)

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

时间:2022-10-29 21:37:36

相关推荐

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)

-- INNERJOIN 这个代码就可以改成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-你需要的数,自建一个

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。