我想计算从每月1日开始而不是从星期一开始的一个月的星期几。 它需要是第一。到了第7,第8。到14日,15日。到了21日,22日。到了第28,第29。直到月底。
因此,如果我将日期作为 2015-12-30 00:00 ,则应将周开始日期返回为 2015-12-29 00:00 和周结束日期为 2016-01-01 00:00
我尝试了下面的脚本,但它给了我星期一的周开始。
答案 0 :(得分:1)
第一步是建立当月的当前周,由当月的当天给出除以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
最后,周末需要一个案例陈述来检查它是否仍然与周开始的月份相同:
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
答案 1 :(得分:0)
您可以在EOMONTH()上使用DATEADD()。例如。从EOMONTH减去一天,以获得该月的天数。
要计算一个月中的周数,请取EOMONTH并将其除以7.使用FLOOR()函数删除余数。
DECLARE @date DATETIME = GETDATE();
SELECT EOMONTH ( @date ) AS 'This Month';
SELECT EOMONTH ( @date, 1 ) AS 'Next Month';
SELECT EOMONTH ( @date, -1 ) AS 'Last Month';
GO
答案 2 :(得分:0)
有点晚了,但这就是我的用法:
DECLARE @now datetime = GETDATE();
-- strip the time part from your date
DECLARE @date datetime = CONVERT(date, @now);
-- do the day of week math
DECLARE @start datetime = DATEADD(d, 1 - DATEPART(w, @date), @date),
@end datetime = DATEADD(d, 8 - DATEPART(w, @date), @date);
SELECT @start AS [WeekStart], @now AS [Now], @end AS [WeekEnd];
请记住,BETWEEN
运算符会生成包含[@start, @end]
的日期范围,因此从技术上讲,您应该使用@start <= [Date] AND [Date] < @end
或从@end
减去1毫秒 - 除非您能够活在下周正好0毫秒内记录事件的1 / 86,400,000的可能性!