获取当年的法定节假日和周末

介绍

我已经找到了一个如何计算两个日期之间的工作日数的示例,但是我还没有找到一种发布方法来添加工作日。 Excel最近添加了此功能,但Microsoft尚未将其提供给Access领域。 因此,我承担了这一挑战。 我创建的函数使用户可以指定不包括哪些天数(对于周末),并且还允许排除假日列表。 必须在表格中输入假期才能使用。 我创建了自己的方法来自动从Internet获取此信息,但这是另一篇文章的主题。

桌子

我能想到的最好的方法是列出可用日期,然后递减指定天数的记录。 这意味着我们需要一个日期列表。 不必将它们全部键入一个表中,我们将让Access处理这个问题。 我们需要的是一个包含单个字段的表:

 tbl_ExpansionDigits
Digit

现在添加10个记录,值从0到9

我们还需要一个假期表。 我的表有一个日期字段和一个名称字段,以便我可以列出假期名称。

 dbo_Holidays
hDate
hName

表格查询就是这样

我们实际上只需要一个查询。 这就是给我们约会的神奇之处。 我的名字叫qryPossibleDates。

SELECT Cdate([tbl_expansiondigits_1]![Digit]+[tbl_expansiondigits_2]![Digit]*10+[tbl_expansiondigits_3]![Digit]*100+[tbl_expansiondigits_4]![Digit]*1000 +[tbl_expansiondigits_5]![Digit]*10000) AS CalcDate, Weekday(CalcDate) AS WeekDayNumber
FROM tbl_expansiondigits AS tbl_expansiondigits_1, tbl_expansiondigits AS tbl_expansiondigits_2, tbl_expansiondigits AS tbl_expansiondigits_3, tbl_expansiondigits AS tbl_expansiondigits_4, tbl_expansiondigits AS tbl_expansiondigits_5
WHERE ((([tbl_expansiondigits_1]![Digit]+[tbl_expansiondigits_2]![Digit]*10+[tbl_expansiondigits_3]![Digit]*100+[tbl_expansiondigits_4]![Digit]*1000+[tbl_expansiondigits_5]![Digit]*10000)>=36000));

这使我们的日期从1998年7月24日到10/13/2173(共64,000天)加上工作日的日期(星期日为1,星期六为7)。

首先,我们需要一个函数来将类似二进制的数字转换为十进制值。 我将其用于二进制标志,以了解从计数中排除哪些天。

Private Function ConvertToDecimal(lngBinary As Long) As Long
Dim strNumber As String
Dim i As Integer
Dim lngAccumulator As Long
Dim n As Integer
Dim s As String
Dim p As Integer
strNumber = Format(lngBinary, "00000000")
p = 1
For i = 8 To 1 Step -1s = Mid(strNumber, p, 1)If s = "1" Thenn = CInt(i) - 1lngAccumulator = lngAccumulator + 2 ^ nEnd Ifp = p + 1
Next
ConvertToDecimal = lngAccumulator
End Function

现在为主要功能。

Public Function AddDays(dteStart As Date, intInterval As Integer, lngExcludePattern As Long) As Date
Dim lngExcludeDates As Long
Dim strSelect As String
Dim strWhere As String
Dim strSQL As String
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim i As Integer
If lngExcludePattern <> 0 ThenlngExcludeDates = ConvertToDecimal(lngExcludePattern)strSelect = "SELECT CalcDate As AddedDate FROM qryPossibleDates"strWhere = "CalcDate = #" & dteStart & "# Or (CalcDate >= #" & dteStart & "# And CalcDate Not In(SELECT hDate FROM dbo_Holidays WHERE hDate >= #" & dteStart & "#)" If (lngExcludeDates And 64) > 0 ThenstrWhere = strWhere & " And WeekDayNumber <> 1"End If If (lngExcludeDates And 32) > 0 ThenstrWhere = strWhere & " And WeekDayNumber <> 2"End If If (lngExcludeDates And 16) > 0 ThenstrWhere = strWhere & " And WeekDayNumber <> 3"End If If (lngExcludeDates And 8) > 0 ThenstrWhere = strWhere & " And WeekDayNumber <> 4"End If If (lngExcludeDates And 4) > 0 ThenstrWhere = strWhere & " And WeekDayNumber <> 5"End If If (lngExcludeDates And 2) > 0 ThenstrWhere = strWhere & " And WeekDayNumber <> 6"End If If (lngExcludeDates And 1) > 0 ThenstrWhere = strWhere & " And WeekDayNumber <> 7"End If strWhere = strWhere & ")"strSQL = strSelect & " WHERE " & strWhereDebug.Print strSQL Set db = CurrentDbSet rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges) rst.Move intInterval AddDays = rst!AddedDate Set db = Nothingrst.CloseSet rst = Nothing
ElseAddDays = dteStart + intInterval
End If
End Function

首先,我测试lngExcludePattern中的值。 如果它是0,那么我只是在计算日历天,它跳到底部。 否则,我将构建一个查询字符串,该字符串是从上面添加条件的查询中提取的。 您会注意到它以CalcDate =#“&dteStart&”#“开头 。这是针对dteStart不是查询中包含的日期的情况,因为它确实与所涉及的日期混淆了(我在排除故障后找到了原因我的计数已关闭)。然后它具有仅显示大于或等于dteStart且不在假期列表中的记录的条件,再次将其过滤为大于或等于dteStart(出于性能)。然后测试使用二进制标志来添加其他条件以排除我们不希望包含的星期几,然后打开记录集并使用.Move方法转到记录集中的正确记录以获取日期。是! 使用

要使用此功能,请传递要添加的起始日期x天数(dteStart),要添加的天数(intInterval),然后是要排除的天数(lngExcludePattern)。 前两个非常简单,但是“排除模式”需要更多说明。 我将其设置为二进制标志。 第一个标志是周日,最后一个标志是周六。 因此,如果我希望周末为星期六和星期日,那么我的排除模式将为1000001。如果我也希望排除星期三,那么我的模式将为1001001。如果我只希望排除星期六,则为0000001,也可以输入为1,因为它以长整数形式传递。 因此,如果我想在1/17/16上增加5天(星期六和星期日除外),则可以这样调用函数:

=AddDays(#1/17/16#, 5, 1000001)

结论

可能还有其他方法可以执行此操作,但这似乎是最通用的方法,并且实际上可以完成我想要的操作。 如果有人有任何批评,我欢迎他们。

翻译自: https://bytes.com/topic/access/insights/965404-adding-business-days-configurable-weekend-days-holidays

获取当年的法定节假日和周末

获取当年的法定节假日和周末_通过可配置的周末和节假日添加工作日相关推荐

  1. mySQL用alter使列为空_我可以配置MySQL,以便新添加的列默认允许空值吗?

    默认情况下,MySQL的默认行为是在alter table命令中允许空值.它可能与PHPMyAdmin有关. mysql> desc foo; +-----------+---------+-- ...

  2. 获取当年所有工作日及节假日信息

    1 背景 因为业务需求,需要获取当年所有节假日和工作日信息,机缘巧合找到了一个接口,使用还不错,因为有用户量大会导致次数受限,使用跑批入库方案 2 接口地址 https://api.apihubs.c ...

  3. excel日期相减去除周末_仅在Excel中允许周末日期

    excel日期相减去除周末 With Excel Data Validation, you can add rules to a data entry sheet, and control what ...

  4. 获取本周周一和周末日期、上周周一和周末、下周周一和周末

    今天碰到一个需求:需要穿周一和周末的时间给后端,然后获取一整周的数据,且可以上周\下周切换 1.首先,先写一个方法,根据一个日期来取当周的周一及周末 // 传任意时间,得出该周的周一和周日getWee ...

  5. Java获取当年以及任意一年的第一天和最后一天 获取当天的开始时间和结束时间 自动获取去年的年份 常用于每年的数据统计

    @Slf4j public class DateTimeUtil {/*** 默认日期格式*/public static String DEFAULT_FORMAT = "yyyy-MM-d ...

  6. 简单使用java获取7个法定假期的时间

    文章目录 说明 一.查询假期 1.1 定义一个常量类 二.编写获取假期的类 2.1 结算结果 说明 本文简单介绍了如何获取7个法定假期的时间,如有出入,请留言,积极接收批评 为了获取农历日期简单点,使 ...

  7. delphi7升级delphi2007可以互用马_马爹利鼎盛周末饭局暂停营业,未来再见

    上周,在武汉引领起一场新型社交潮流的马爹利鼎盛周末饭局,迎来完美Ending. 近两个月来,你或许在朋友圈看到过关于马爹利鼎盛周末饭局的消息,那些活跃在潮流前线的年轻人,无一例外的讨论着这个横空出现的 ...

  8. pandas使用bdate_range函数获取起始时间(start)和结束时间(end)范围内的所有工作日日期(business day)

    pandas使用bdate_range函数获取起始时间(start)和结束时间(end)范围内的所有工作日日期(business day) #pandas使用bdate_range函数获取起始时间(s ...

  9. Maven工作笔记003---公司只允许代理上网_给maven配置代理下载jar包

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 公司只允许代理上网_给maven配置代理_下载jar包啊 配置很简单: 找到maven的setti ...

最新文章

  1. android EditText 修改光标的颜色值
  2. unix网络编程之简介
  3. matlab柱状斜线_Matlab:柱状图饼状图填充不同条纹
  4. 国家的重视让少儿编程越来越火爆!
  5. Java阶段性测试--知识点:数组,面向对象,集合、线程,IO流
  6. torch.roll() 详解
  7. CString string 转换
  8. redis的压缩列表源码ziplist解析
  9. php音频格式 操作,php操作视频音频类-ffmpeg-php
  10. 均分纸牌模型之mxj分礼物
  11. 常见电容器图片_工业机器视觉的常见应用与施努卡VisionMax视觉系统介绍
  12. Error response from daemon: OCI runtime exec failed: exec failed: container_linux.go:345:
  13. win7电脑麦克风有电流声怎么办
  14. MacW资讯:苹果MAC电脑便笺字体和颜色怎么修改
  15. 知乎视频该如何玩能够赚到一波,5K字揭秘!
  16. 汉诺塔(3塔、4塔思路详记)
  17. 如何在 Android 上自定义来电通知?带有代码示例
  18. 时至今日,写字依然是很好的职场“捷径”
  19. 苹果的AR真那么高科技?带你见识这些神奇AR应用
  20. 转载:如何更加科学理性地认识功率曲线

热门文章

  1. 数据结构算法-二叉树
  2. 漫画影视化背后,IP成漫改的通关秘籍?
  3. 28BYJ-48 步进电机
  4. 大数据部门的作用与大数据工程师的工作
  5. android app签名方法
  6. 前后端交互之——AJAX提交
  7. 【SVAC】SVAC标准简介
  8. 个人网站引入B站视频播放,个人博客播放B站视频。【1080P】
  9. 基于消息系统架构设计
  10. 【方法/函数】 矩阵相乘