SQL:如何获取周开始日期&周结束日期

时间:2015-12-22 11:34:44

标签: sql sql-server-2008 datetime

我想计算从每月1日开始而不是从星期一开始的一个月的星期几。 它需要是第一。到了第7,第8。到14日,15日。到了21日,22日。到了第28,第29。直到月底。

因此,如果我将日期作为 2015-12-30 00:00 ,则应将周开始日期返回为 2015-12-29 00:00 和周结束日期为 2016-01-01 00:00

我尝试了下面的脚本,但它给了我星期一的周开始。

enter image description here

3 个答案:

答案 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];

SQL Week start and end from date

请记住,BETWEEN运算符会生成包含[@start, @end]的日期范围,因此从技术上讲,您应该使用@start <= [Date] AND [Date] < @end或从@end减去1毫秒 - 除非您能够活在下周正好0毫秒内记录事件的1 / 86,400,000的可能性!