sql - 根据日历表中的下一个工作日选择
问题描述
我已经填写了一个日历表(Calendar_Date、Is_Business_Day)。
我已经设法SELECT
在此基础上做了一个:
- 如果今天在当月 3 日之前,则选择该日之前到倒数第二个月最后一天的所有日子
例如:今天是 2018-05-02,这是我的输出:
Calendar_Date | Is_Business_Day
2000-01-01 | 0
... |
2018-03-29 | 1
2018-03-30 | 1
2018-03-31 | 0
- 如果今天在当月的第 3 天之后,则选择该天之前的所有天,直到上个月的最后一天。
例如:明天,2018-05-03,这将是我的输出:
Calendar_Date | Is_Business_Day
2000-01-01 | 0
... |
2018-04-28 | 0
2018-04-29 | 0
2018-04-30 | 1
这是我的查询:
SELECT Calendar_Date, Is_Business_Day
FROM Calendar_Table
WHERE (Calendar_Date <= (CASE WHEN DATEPART(day, GETDATE()) >= 3 THEN EOMONTH(DATEADD(MONTH, - 1, GETDATE())) ELSE EOMONTH(DATEADD(MONTH, - 2, GETDATE())) END))
这工作得很好,但我现在想做的是在每月第三天之后的第一个工作日之后切换,而不是在每月第三天之后切换。
如何使用日历表中有关工作日的信息来执行此操作?
解决方案
我认为以下查询应该有效。
;WITH CTE AS
(
SELECT Calendar_Date, Is_Business_Day
FROM Calendar_Table
WHERE (Calendar_Date <= (CASE WHEN DATEPART(day, GETDATE()) >= 3
THEN EOMONTH(DATEADD(MONTH, - 1, GETDATE()))
ELSE EOMONTH(DATEADD(MONTH, - 2, GETDATE())) END))
)
SELECT * FROM CTE
WHERE Calendar_Date >= (SELECT MIN(Calendar_Date) FROM CTE WHERE Is_Business_Day=1)
推荐阅读
- angular - 在 BlazeMeter 上使用 Firebase 对 Angular 应用程序进行负载测试会引发大量“未知 SID”错误
- excel - 在 Excel 中计算 2 字和 3 字字符串的频率
- actions-on-google - 谷歌助手操作生成器中深度链接的槽识别问题
- google-drive-api - 通过 Postman 批量请求 Google Drive API 权限时出现 500 内部未知错误
- jasmine - 茉莉花浏览器运行程序可以与终端记者一起使用吗?或其他测试输出方式
- java - MissingResourceException:找不到捆绑包
- node.js - 从 npm 脚本运行 docker 不起作用
- jquery - 为 TokenAuthentication DRF 安全地从 jQuery Ajax 调用访问令牌
- soap - 无法请求 TokenCreateRQ 1.0.0
- javascript - 当fancybox 打开并处于活动状态时,jQuery 不起作用