第一步是确定当月的当前周,由当月的当天除以 7(向上取整)得出,然后您可以通过乘以周来获得当前周的开始日期数字 7 并增加一天。最后,您可以使用当月的第一天和DATEADD(DAY 来获取星期几的开始日期。阶段是:
DECLARE @Date DATE = '2015-12-30';
SELECT WeekNumberOfMonth = CEILING(DATEPART(DAY, @Date) / 7.0),
WeekStartDay = 1 + FLOOR((DATEPART(DAY, @Date) - 1) / 7.0) * 7,
FirstDayOfMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0),
WeekStart = DATEADD(DAY,
(CEILING(DATEPART(DAY, @Date) / 7.0) - 1) * 7,
DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0));
这给出了:
WeekNumberOfMonth WeekStartDay FirstDayOfMonth WeekStart
--------------------------------------------------------------------
5 29 2015-12-01 2015-12-29
最后,周末需要一个case语句来检查它是否仍然与一周开始在同一个月:
DECLARE @Date DATE = '2015-12-30';
SELECT d.WeekStart,
Weekend = CASE WHEN DATEADD(DAY, 7, WeekStart) > StartOfNextMonth
THEN StartOfNextMonth
ELSE DATEADD(DAY, 7, WeekStart)
END
FROM ( SELECT WeekStart = DATEADD(DAY,
((DATEPART(DAY, @Date) - 1) / 7.0) * 7,
DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0)),
StartOfNextMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date) + 1, 0)
) AS d;
这给出了:
WeekStart Weekend
----------------------------
2015-12-29 2016-01-01
进一步测试
SELECT d.[Date],
d.WeekStart,
Weekend = CASE WHEN DATEADD(DAY, 7, WeekStart) > StartOfNextMonth
THEN StartOfNextMonth
ELSE DATEADD(DAY, 7, WeekStart)
END
FROM ( SELECT dt.[Date],
WeekStart = DATEADD(DAY,
(CEILING(DATEPART(DAY, dt.[Date]) / 7.0) - 1) * 7,
DATEADD(MONTH, DATEDIFF(MONTH, 0, dt.[Date]), 0)),
StartOfNextMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, dt.[Date]) + 1, 0)
FROM (VALUES
(CONVERT(DATE, '20151106')),
(CONVERT(DATE, '20151107')),
(CONVERT(DATE, '20151220')),
(CONVERT(DATE, '20151228')),
(CONVERT(DATE, '20151230')),
(CONVERT(DATE, '20160104'))
) dt ([Date])
) AS d;
输出
Date WeekStart Weekend
-------------------------------------------
2015-11-06 2015-11-01 2015-11-08
2015-11-07 2015-11-01 2015-11-08
2015-12-20 2015-12-15 2015-12-22
2015-12-28 2015-12-22 2015-12-29
2015-12-30 2015-12-29 2016-01-01
2016-01-04 2016-01-01 2016-01-08