PostgreSQL中如何区分伊朗节假日与工作日并扣除节假日时长?
解决跨库无法JOIN时扣除节假日天数的问题
这问题我碰到过类似的,跨库不能JOIN确实麻烦,不过有两种可行的办法解决,看你节假日数量多少来选:
方法一:硬编码节假日列表(适合节假日数量少的情况)
如果你的节假日数量不多,直接把已知的节假日日期内嵌到查询里就行。下面以SQL Server为例(其他数据库只需要调整日期转换函数):
SELECT start_date, finish_date, datediff(day) AS datediff_day, datediff(day) - ( -- 内嵌节假日列表 SELECT COUNT(*) FROM ( VALUES ('03/05/2018'), ('03/11/2018'), ('03/19/2018') ) AS holidays(holiday_date) -- 转换为日期类型后判断是否在当前区间内 WHERE CONVERT(date, holiday_date, 101) BETWEEN CONVERT(date, start_date, 101) AND CONVERT(date, finish_date, 101) ) AS Difference_of_time_except_the_holidays FROM time_intervals;
注意:如果是MySQL,把CONVERT(date, xxx, 101)换成STR_TO_DATE(xxx, '%m/%d/%Y');如果是Oracle,换成TO_DATE(xxx, 'MM/DD/YYYY'),确保日期比较是基于日期类型而非字符串,避免格式错误。
方法二:导入节假日数据到当前库(适合节假日数量多的情况)
如果节假日数量较多,硬编码太麻烦,你可以先把另一个数据库里的节假日数据导入到当前库的临时表或永久表,再进行关联计算:
步骤1:创建临时表并导入节假日数据
-- 在时间区间表所在的数据库执行 CREATE TABLE #temp_iran_holidays (holiday_date DATE); -- 从另一个数据库导入数据(语法根据数据库类型调整) -- SQL Server 示例 INSERT INTO #temp_iran_holidays (holiday_date) SELECT holiday_date FROM [holiday_db].[dbo].[iran_holidays]; -- MySQL 示例 INSERT INTO #temp_iran_holidays (holiday_date) SELECT holiday_date FROM holiday_db.iran_holidays;
步骤2:计算扣除节假日后的天数
SELECT ti.start_date, ti.finish_date, ti.datediff(day) AS datediff_day, ti.datediff(day) - COUNT(th.holiday_date) AS Difference_of_time_except_the_holidays FROM time_intervals ti LEFT JOIN #temp_iran_holidays th ON th.holiday_date BETWEEN CONVERT(date, ti.start_date, 101) AND CONVERT(date, ti.finish_date, 101) GROUP BY ti.start_date, ti.finish_date, ti.datediff(day);
这两种方法都能得到你想要的结果,第一种快捷适合少量节假日,第二种更适合长期维护、节假日较多的场景。
内容的提问来源于stack exchange,提问作者navid karampour
相关产品推荐
相关产品推荐

