SQL 如何得到两个日期间的工作日(附假期表)

首先,我们有这样一张表

我们要知道两个日期间的工作日天数,相信大家有遇到过这个恶心人的需求,所谓工作日,不简简单单的就是除周六日以外的日子。要考虑到节假日,国庆啊,中秋啊,最让人头疼的是,你根本无法掌控节假日的规律,因为他就是无规律可言。

所以要求出工作日的天数,我们还需要一张假日表,这张表可以帮助我们分清到底那天是节假日,那天是工作日,在末尾我会附上网盘链接,这个表是怎么来的大家应该都清楚,说了无规律,那么只能人工一个个比对了。 

基本的需求就是用这两张表关联,求出第一张表的两个日期间的工作日天数即可

我们可以选择这样,一开始我有一个思路,就是求出来日期间的所有天数,然后将此表与假期表关联查询假日有多少天,相减不就正确了,然后我搞了半天才发现,这个好像没办法关联。。所以我们只能用第二种办法。

 

第二种办法,就是讲第一张表拆分,就例如,将这样的一条数据

拆分为这样

然后再用日期列,去关联假日表的数据,把非工作日的去除,剩下的条数就是工作日的天数。

假日表中:

对应的三天都为工作日,那么最终就是这三条,最后GROUP BY id 列,求出COUNT(*),就是最后的天数,下面上代码。

第一张日期表:[DW].[dbo].[TAB Row Data From ECC temp6]

第二章假日表:[TAB].[dbo].[holiday]

具体字段上边都有对应,请自行更改

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
		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
		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])
		)
	) a
GROUP BY
	id,
	[SP PO creation Date],
	[HUB GI date]

 最后截图:

接下来大家期待已久的整理出来的假期表:直接上。

链接:https://pan.baidu.com/s/1J9pVGX4xMbsUe69txCGg_Q 
提取码:lhaj 
 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: MySQL可以通过使用期函数和自定义来分工作日假期。 首先,我们可以使用MySQL期函数来获取工作日假期的信息。例如,我们可以使用WEEKDAY函数来获取给定期是星期几,以确定是否为工作日。该函数返回的值从0到6,其中0示星期一,1示星期二,以此类推。我们还可以使用MONTH和YEAR函数来获取给定期的月份和年份。 接下来,我们可以在MySQL中创建一个自定义的假期,其中包含所有的假期期。这个可以包括期和假期名称等列。我们可以使用INSERT语句将所有假期期插入到假期中。然后,可以使用JOIN语句将工作日假期连接起来,以便在查询中过滤掉假期期。 例如,假设有一个名为"dates"的,包括一个"date"列,存储了需要判断的期。假设还有一个名为"holidays"的,包括一个"date"列存储假期期,以及一个"name"列存储假期的名称。以下是一个示例查询,将"dates"中的期分为工作日假期: ``` SELECT dates.date, IF(holidays.date IS NULL, '工作日', holidays.name) AS type FROM dates LEFT JOIN holidays ON dates.date = holidays.date ``` 上述查询使用LEFT JOIN来将"dates"和"holidays"连接起来,根据期进行匹配。通过判断"holidays.date"是否为空,可以确定每个期是工作日还是假期。如果为空,则示是工作日;否则,示是假期,并将假期的名称存储在"type"列中。 通过这种方式,可以分工作日假期,并根据需要进行进一步的处理或统计。 ### 回答2: MySQL是一种流行的关系型数据库管理系统,可用于存储和管理各种数据。在MySQL中,可以使用期函数来分别处理工作日假期。 要查询工作日,可以使用WEEKDAY函数。WEEKDAY函数返回指定期的星期几,星期一到星期五被认为是工作日,星期六和星期被认为是非工作日。所以,通过使用WEEKDAY函数,我们可以筛选出工作日期。 例如,假设我们有一个名为"dates"的期字段,我们可以使用以下查询来找到工作日期: ``` SELECT date FROM table_name WHERE WEEKDAY(date) < 5; ``` 若要查询假期期,我们可以使用期函数和一个预定义的假期,来筛选出假期期。 例如,假设我们有一个名为"holidays"的假期,其中包含所有的假期期。我们可以使用以下查询来找到在假期中的期: ``` SELECT date FROM table_name WHERE date IN (SELECT holiday_date FROM holidays); ``` 此外,我们还可以使用DATE_SUB和DATE_ADD函数来计算指定期之前或之后的期,以及使用DATEDIFF函数来计算两个期之间的天数差。 总而言之,MySQL提供了强大的期函数来处理工作日假期。使用这些函数,我们可以轻松地分离工作日假期,并进行相应的查询和计算。 ### 回答3: MySQL可以通过使用函数和来区分工作日假期。下面是一个简单的方式来实现: 1. 创建一个来存储所有的假期期。结构可以包括期字段和假期名字字段。用户可以根据需要预先将假期期添加到这个中。 2. 创建一个函数来判断一个给定期是否为工作日或者假期。这个函数可以接受一个期作为参数,并返回一个布尔值示该期是否为工作日。在函数中,我们可以使用MySQL的内置函数来获取给定期的星期几,再与假期中的期进行比较,根据结果返回布尔值。 示例代码如下: ```sql CREATE TABLE holidays ( holiday_date DATE PRIMARY KEY, holiday_name VARCHAR(255) ); INSERT INTO holidays VALUES ('2022-01-01', '元旦'); -- 添加更多假期期 DELIMITER $$ CREATE FUNCTION is_workday(date_val DATE) RETURNS BOOLEAN BEGIN DECLARE is_holiday BOOLEAN; SET is_holiday = 0; -- 判断是否为假期 SELECT COUNT(*) INTO is_holiday FROM holidays WHERE holiday_date = date_val; -- 判断是否为周末 IF WEEKDAY(date_val) = 5 OR WEEKDAY(date_val) = 6 THEN SET is_holiday = 1; END IF; RETURN NOT is_holiday; END$$ DELIMITER ; -- 使用示例 SELECT is_workday('2022-01-01'); -- 返回0,因为元旦是假期 SELECT is_workday('2022-01-03'); -- 返回1,因为这是工作日 ``` 通过上述方法,我们可以方便地区分MySQL中的期是工作日还是假期。用户也可以根据实际情况修改和扩展这个函数和假期,以适应不同的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值