sql - 查找每个月的第一个和最后一个工作日sql
问题描述
我试图找到自 1986 年以来每个月的第一个和最后一个工作日。使用它,我可以找到任何给定月份的第一天,但只是那个月,它不考虑它是工作日还是不是。为了方便起见,工作日只是工作日,不考虑公共假期。
SELECT DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,getdate()),0))
但我无法获得正确的工作日,所以我创建了一个包含所有工作日的日历表,并认为我可以从每个月中提取 min(date),但我目前被卡住了。
Date
---------------
1986-01-01
1986-01-02
1986-01-03
1986-01-06
...and so on
我试图获得每个月的第一天,但它没有考虑这一天是否是周末。它只是简单地给出每个月的第一天
declare @DatFirst date = '20000101', @DatLast date = getdate();
declare @DatFirstOfFirstMonth date = dateadd(day,1-day(@DatFirst),@DatFirst);
select DatFirstOfMonth = dateadd(month,n,@DatFirstOfFirstMonth)
from (select top (datediff(month,@DatFirstOfFirstMonth,@DatLast)+1)
n=row_number() over (order by (select 1))-1
from (values (1),(1),(1),(1),(1),(1),(1),(1)) a (n)
cross join (values (1),(1),(1),(1),(1),(1),(1),(1)) b (n)
cross join (values (1),(1),(1),(1),(1),(1),(1),(1)) c (n)
cross join (values (1),(1),(1),(1),(1),(1),(1),(1)) d (n)
) x
我想知道是否有人可以阐明我如何最好地解决这个问题。
解决方案
如果您已经有了包含所有可用日期的日历表,那么您只需要按工作日进行过滤。
SET DATEFIRST 1 -- 1: Monday, 7: Sunday
SELECT
Year = YEAR(T.Date),
Month = MONTH(T.Date),
FirstBusinessDay = MIN(T.Date),
LastBusinessDay = MAX(T.Date)
FROM
Calendar AS T
WHERE
DATEPART(WEEKDAY, T.Date) BETWEEN 1 AND 5 -- 1: Monday, 5: Friday
GROUP BY
YEAR(T.Date),
MONTH(T.Date)
您应该使用查询在日历表上标记这些日子,以便之后轻松访问它们。
这就是您可以将它与日历表的生成(使用递归)混合的方式。
SET DATEFIRST 1 -- 1: Monday, 7: Sunday
declare
@DatFirst date = '20000101',
@DatLast date = getdate();
;WITH AllDays AS
(
SELECT
Date = @DatFirst
UNION ALL
SELECT
Date = DATEADD(DAY, 1, D.Date)
FROM
AllDays AS D
WHERE
D.Date < @DatLast
),
BusinessLimitsByMonth AS
(
SELECT
Year = YEAR(T.Date),
Month = MONTH(T.Date),
FirstBusinessDay = MIN(T.Date),
LastBusinessDay = MAX(T.Date)
FROM
AllDays AS T
WHERE
DATEPART(WEEKDAY, T.Date) BETWEEN 1 AND 5 -- 1: Monday, 5: Friday
GROUP BY
YEAR(T.Date),
MONTH(T.Date)
)
SELECT
*
FROM
BusinessLimitsByMonth AS B
ORDER BY
B.Year,
B.Month
OPTION
(MAXRECURSION 0) -- 0: Unlimited
推荐阅读
- android - 通过 adb-shell 命令“fastboot 擦除缓存”从手机上的所有应用程序中擦除缓存
- angular - Angular Firebase 2 - 从数据库中读取数据一次
- spreadsheet - 使用 Python 2.65 写入电子表格
- apache - Apache 服务器未在 Xampp 便携版上启动
- php - 迭代数据并将csv文件放入php中的问题
- go - 获取调用函数的名称和包
- twilio - 如何在客户端之间转移 twilio 入站呼叫
- javascript - jQuery 不正确的数组处理:长度 = 0 错误?
- node.js - 服务器端 (Node.js) 和客户端 (Angular) 上的 Socket.io 路径
- php - PHP - 为值会话设置键的多个维度的方法